json解析之Gson以及jackson的简单运用

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

猜你喜欢

转载自blog.csdn.net/zb52588/article/details/80313173