jackson是一個用Java編寫的,用來處理JSON格式數(shù)據(jù)的類庫,它速度非常快,目前來看使用很廣泛,逐漸替代了Gson和json-lib。
這是大神解析效率的測試數(shù)據(jù)的網(wǎng)站http://wangym.iteye.com/blog/738933
最終結(jié)果是Jackson > Gson > Json-lib。這也就是為什么要掌握jackson解析的意義了
下面是我練習(xí)寫的一個demo,其實使用起來和Gson比較類似****
首先建一個單例的類提供ObjectMapper對象,后面很多操作會用到這個對象
import org.codehaus.jackson.map.ObjectMapper;
/** * 只用創(chuàng)建一次ObjectMapper對象就可以了 */
public class JacksonMapper {
private static ObjectMapper mapper ;
public static ObjectMapper getMapper(){
if(mapper==null){
synchronized (JacksonMapper.class){
if(mapper == null){
mapper = new ObjectMapper();
}
}
}
return mapper;
}
}
然后創(chuàng)建ProductBean對象
這是我解析用的json字符串
{"productProperty":[{"v":"紅色","k":"顏色","id":1},{"v":"L","k":"尺寸","id":2}],"name":"毛衣","price":130.0,"id":1}
import java.util.List;
public class ProductBean {
public int id; public String name;
public float price;
public List<ProductPropertyBean> productProperty;
public ProductBean() { }
public ProductBean(int id, String name, float price, List<ProductPropertyBean> productProperty) {
this.id = id;
this.name = name;
this.price = price;
this.productProperty = productProperty;
}
@Override
public String toString() {
return "ProductBean{" +
"id=" + id +
", name='" + name + '\'' +
", price=" + price +
", productProperty=" + productProperty + '}';
}
}
//商品屬性
public class ProductPropertyBean {
/** * id : 1 * k : 顏色 * v : 紅色
*/
public int id;
public String k;
public String v;
public ProductPropertyBean() { }
public ProductPropertyBean(int id, String k, String v) {
this.id = id;
this.k = k;
this.v = v;
}
@Override
public String toString() {
return "ProductPropertyBean{" +
"id=" + id +
", k='" + k + '\'' +
", v='" + v + '\'' + '}';
}
}
jackson使用和Gson比較類似
傳遞對應(yīng)的json字符串,和bean對象的字節(jié)碼就可以了,
如果是數(shù)組就傳對應(yīng)的List的字節(jié)碼
mMapper.readValue(jsonString, ProductBean.class);
想把bean對象轉(zhuǎn)換成json字符串
同樣的如果是List直接傳遞List對象就可以了
mMapper.writeValueAsString(objectBean);
一般也就這兩種用法
還有節(jié)點解析要用到JsonNode這個對象,類似map根據(jù)key獲取對應(yīng)的value值然后asInt()等對應(yīng)的數(shù)據(jù)類型就可以了,如果獲取的是對象或數(shù)組,那只能先tostring()獲取對象的json字符串才能接著解析,也就是要一層一層的解析
(注意:對象或數(shù)組用asText()獲取的字符串為空,所以必須用tostring())
JsonNode jsonNode = mMapper.readTree(objectJson);
JsonNode name = jsonNode.get("name");
JsonNode price = jsonNode.get("price");
JsonNode id = jsonNode.get("id");
name.asText();
public class MainActivity extends AppCompatActivity {
private static final String TAG ="MainActivity" ;
@Bind(R.id.tv_object_tojson)
TextView mObjectTvTojson;
@Bind(R.id.tv_array_tojson)
TextView mArrayTvTojson;
@Bind(R.id.tv_toObject)
TextView mTvToObject;
@Bind(R.id.tv_toList)
TextView mTvToList;
@Bind(R.id.activity_main)
LinearLayout mActivityMain;
private ObjectMapper mMapper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
mMapper = JacksonMapper.getMapper();
//創(chuàng)建ProductBean對象
ProductBean productBean = createObject();
//將對象解析成json字符串
String objectJson = toJson(productBean);
// String json = toJson2(productBean);
mObjectTvTojson.setText("toJson==="+objectJson);
//將數(shù)組轉(zhuǎn)化成json字符串
ArrayList<ProductBean> beanArrayList = new ArrayList<>();
beanArrayList.add(productBean);
beanArrayList.add(productBean);
beanArrayList.add(productBean);
String arrayJson =toJson(beanArrayList);
mArrayTvTojson.setText("toJson==="+arrayJson);
//將json字符串解析為bean
ProductBean bean = toObjectBean(objectJson);
mTvToObject.setText("toObjectBean==="+bean.toString());
//將json字符串解析為List
ArrayList<ProductBean> list = toArrayBean(arrayJson);
mTvToList.setText("toArrayBean==="+list.toString());
//jackson節(jié)點解析
jsonNode(objectJson);
}
public void jsonNode(String objectJson) {
//{"productProperty":[{"v":"紅色","k":"顏色","id":1},{"v":"L","k":"尺寸","id":2}],"name":"毛衣","price":130.0,"id":1}
try {
JsonNode jsonNode = mMapper.readTree(objectJson);
JsonNode productProperty = jsonNode.get("productProperty");
JsonNode name = jsonNode.get("name");
JsonNode price = jsonNode.get("price");
JsonNode id = jsonNode.get("id");
String propertyString = productProperty.toString();
//如果要轉(zhuǎn)化成對象的話還得用 ObjectMapper的readValue(), productProperty如果用JsonNode的asText()獲取的是空
ArrayList productPropertyBeans = mMapper.readValue(propertyString, new ArrayList<ProductPropertyBean>().getClass());
Log.d(TAG, "jsonNode:name: "+name.asText());
Log.d(TAG, "jsonNode:id: "+id.asInt());
Log.d(TAG, "jsonNode: price:"+price.asDouble());
Log.d(TAG, "jsonNode:
productPropertyBeans"+productPropertyBeans.toString());
} catch (IOException e) {
e.printStackTrace();
Log.d(TAG, "jsonNode: "+e.toString());
}
}
public ProductBean createObject(){
//創(chuàng)建ProductBean對象
ProductPropertyBean color = new ProductPropertyBean(1,"顏色","紅色");
ProductPropertyBean size = new ProductPropertyBean(2,"尺寸","L");
ArrayList<ProductPropertyBean> productPropertyBeen = new ArrayList<>();
productPropertyBeen.add(color); productPropertyBeen.add(size);
ProductBean productBean = new ProductBean(1,"毛衣",130,productPropertyBeen);
return productBean;
}
public String toJson(Object o){
String s;
try {
//將對象解析成json字符串
s = mMapper.writeValueAsString(o);
} catch (IOException e) {
e.printStackTrace();
s = e.toString();
}
Log.i(TAG, "getJson: "+s);
return s;
}
public String toJson2(Object o){
String s;
try {
//將對象解析成json字符串
StringWriter stringWriter = new StringWriter();
JsonFactory jsonFactory = mMapper.getJsonFactory();
JsonGenerator jgen = jsonFactory.createJsonGenerator(stringWriter);
mMapper.writeValue(jgen,o);
jgen.flush();
jgen.close();
s = stringWriter.toString();
stringWriter.close();
} catch (IOException e) {
e.printStackTrace();
s = e.toString();
}
Log.i(TAG, "getJson: "+s);
return s;
}
public ProductBean toObjectBean(String json){
ProductBean productBean = null;
try {
productBean = mMapper.readValue(json, ProductBean.class);
} catch (IOException e) {
e.printStackTrace();
}
return productBean;
}
public ArrayList<ProductBean> toArrayBean(String json){
ArrayList list = null;
try {
list = mMapper.readValue(json, new ArrayList<ProductBean>().getClass());
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
}
練習(xí)demo的下載https://github.com/starrysky0/jacksondemo
初次嘗試寫這些東西,主要是總結(jié)一下自己的學(xué)習(xí)情況,如果有什么錯誤或不足,真誠的希望大神們能指出來