json解析之Gson以及jackson的简单运用
示例json字符串如下:
{
"id": "0b1c725c771c402db88e31f8fb37f820",
"picture": null,
"Slides": [{
"ID": null,
"Width": 0.0,
"Height": 0.0,
"Background": {
"BgType": 1,
"Source": "#FFA0F1FA"
},
"Widgets": [{
"ID": null,
"X": 200.0,
"Y": 200.0,
"ZOrder": 0,
"Angle": 0.0,
"Width": 336.0,
"Height": 212.0
}]
}]
}
**Gson中构造的类的字段名一定要和json中的key值一致,不然无法识别
其次Gson中的子对象如果用内部类的话必须要static关键字修饰
最后一点就是:一般数组[]通常使用List表示,当然用数组表示也是可以得**
一、GSON的使用关键在于构建所需要的类
1.1、首先Widget是一个数组,里面是一个标准对象:
package com.ahtelit.zbv.myapplication.javabean;
public class ViewObject {
private String ID;
private float X;
private float Y;
private int ZOrder;
private float Angle;
private float Width;
private float Height;
private String Title;
private String Data;
private String FontProperty;
private String ResourcePath;
private int Type;
private String WidgetProperty;
private boolean IsSelected;
public String getID() {
return ID;
}
public void setID(String ID) {
this.ID = ID;
}
public float getX() {
return X;
}
public void setX(float x) {
X = x;
}
public float getY() {
return Y;
}
public void setY(float y) {
Y = y;
}
public int getZOrder() {
return ZOrder;
}
public void setZOrder(int ZOrder) {
this.ZOrder = ZOrder;
}
public float getAngle() {
return Angle;
}
public void setAngle(float angle) {
Angle = angle;
}
public float getWidth() {
return Width;
}
public void setWidth(float width) {
Width = width;
}
public float getHeight() {
return Height;
}
public void setHeight(float height) {
Height = height;
}
@Override
public String toString() {
return "ViewObject{" +
"ID='" + ID + '\'' +
", X=" + X +
", Y=" + Y +
", ZOrder=" + ZOrder +
", Angle=" + Angle +
", Width=" + Width +
", Height=" + Height +
'}';
}
}
1.2、Slide也是一个数组,其包含一个带有数组的对象,里面的BG比较简单就使用静态类
package com.ahtelit.zbv.myapplication.javabean;
import java.util.List;
public class ViewCollection {
private String ID;
private float Width;
private float Height;
private BGOject Background;
private List<ViewObject> Widgets;
public String getID() {
return ID;
}
public void setID(String ID) {
this.ID = ID;
}
public float getWidth() {
return Width;
}
public void setWidth(float width) {
Width = width;
}
public float getHeight() {
return Height;
}
public void setHeight(float height) {
Height = height;
}
public BGOject getBackground() {
return Background;
}
public void setBackground(BGOject background) {
Background = background;
}
public List<ViewObject> getWidgets() {
return Widgets;
}
public void setWidgets(List<ViewObject> widgets) {
Widgets = widgets;
}
@Override
public String toString() {
return "ViewCollection{" +
"ID='" + ID + '\'' +
", Width=" + Width +
", Height=" + Height +
", Background=" + Background +
", Widgets=" + Widgets +
'}';
}
public static class BGOject{
private int BgType;
private String Source;
public int getBgType() {
return BgType;
}
public void setBgType(int bgType) {
BgType = bgType;
}
public String getSource() {
return Source;
}
public void setSource(String source) {
Source = source;
}
@Override
public String toString() {
return "BGOject{" +
"BgType=" + BgType +
", Source='" + Source + '\'' +
'}';
}
}
}
1.3、最后就是最外面的大类了
package com.ahtelit.zbv.myapplication.javabean;
import java.util.List;
public class PPTObject {
private String id;
private String teacherId;
private String gradeId;
private String subjectId;
private String bookId;
private String chapterId;
private String title;
private String lastModifiedBy;
private String lastModifiedTime;
private String savedPathByTeacher;
private String attachment;
private String picture;
private List<ViewCollection> Slides;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPicture() {
return picture;
}
public void setPicture(String picture) {
this.picture = picture;
}
public List<ViewCollection> getSlides() {
return Slides;
}
public void setSlides(List<ViewCollection> slides) {
Slides = slides;
}
@Override
public String toString() {
return "PPTObject{" +
"id='" + id + '\'' +
", picture='" + picture + '\'' +
", Slides=" + Slides +
'}';
}
}
1.4、类型定义好之后就是使用了
package com.ahtelit.zbv.myapplication.jsonParse;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import com.ahtelit.zbv.myapplication.R;
import com.ahtelit.zbv.myapplication.javabean.PPTObject;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
public class Main8Activity extends AppCompatActivity {
// InputStream inputStream = null;
String json = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main8);
//-------------------获取Assets中某文件夹的所有文件------------------------------
// AssetManager assetManager = getAssets();
// try {
// String[] strs = assetManager.list("kejian");
// for (String path : strs) {
// Log.d("zbv", "path=" + path + "\n");
// }
// } catch (IOException e) {
// Log.e("zbv", "failure", e);
// e.printStackTrace();
// }
//--------------------------------------------------
new Thread(new Runnable() {
@Override
public void run() {
//demo放在assets目录下
InputStream inputStream = null;
try {
inputStream = getResources().getAssets().open("kejian.json");
json = fetchJsonData(inputStream);
// Log.d("zbv","json="+json);
// StringBuffer sb = fetchJsonString(inputStream);
// json = sb.toString();
} catch (IOException e) {
Log.e("zbv", "failure", e);
e.printStackTrace();
} finally {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();
//Gson解析
Gson gson = new Gson();
PPTObject pptObject = gson.fromJson(json, PPTObject.class);
Log.d("zbv","PPTObject="+pptObject);
/**
使用ByteArrayOutputStream写入数据转化成字符串
*/
private String fetchJsonData(InputStream is) throws IOException {
if (is != null) {
byte[] bytes = new byte[is.available()];
ByteArrayOutputStream baos = new ByteArrayOutputStream();
while (true) {
int readLength = is.read(bytes);
if (readLength == -1) {
break;
}
baos.write(bytes, 0, readLength);
}
is.close();
baos.close();
return new String(baos.toByteArray());
}
return "";
}
/**
直接读取用StringBuffer拼接
*/
@NonNull
private StringBuffer fetchJsonString(InputStream inputStream) throws IOException {
StringBuffer sb = new StringBuffer();
byte[] bytes = new byte[1024];
int i = -1;
while ((i = inputStream.read(bytes)) != -1) {
//消除后面有赘余
sb.append(new String(bytes, 0, i));
}
Log.d("zbv", "sb=" + sb.toString());
return sb;
}
@Override
protected void onDestroy() {
super.onDestroy();
// try {
// inputStream.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
}
}
说明:我用AndroidStudio在res的同级目录下创建assets目录放入我的json文本,同eclipse不一样的是,在eclipse中assets是放在res的目录下的,贴这一份activity主要是说明assets的使用,其实GSON的使用看一下就应该知道了,比较好用的,简单
二、JACKSON的使用
其实和Gson一样简单,写好类调用即可,不过我这里遇到了一种情况特此说明下:
如果所给的json字符串的key是大写字母开头的话,jackson识别不出该属性在不给一下属性的情况下会报错,我上面的json就是key有大写属性,可以测试一下:
ObjectMapper mapper=new ObjectMapper();
//阻止反序列化被打断,例如原本有5个属性,而现在仅仅写了一个属性
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
```、
使用调用一下代码即可返回定义的对象:
<div class="se-preview-section-delimiter"></div>
try {
PPTObject jack_ppt=mapper.readValue(json,PPTObject.class);
Log.d(“zbv”,”jackson_ppt=”+jack_ppt);
} catch (IOException e) {
Log.e(“zbv”,”jackson wrong”,e);
e.printStackTrace();
}
“`
三、gson和jackson的jar链接:
百度网盘:https://pan.baidu.com/s/1Iel2htjIRHDewRokD3uaRw
密码:6ztg