Gson解析json对不确定泛型的处理

来源:互联网 发布:淘宝有办假行驶证的吗 编辑:程序博客网 时间:2024/05/16 08:52

最近项目中遇到个问题,服务端返回的json数据中,有个object中的内容是不确定的,条目不确定,key的值也不确定。我们使用的是Gson解析json。对于Gson,要把json转化为对应的实体对象,在不知道json object内部结构的情况下,这似乎不太好解决。

比如,这样的json:
"{a:1, b:'Hello,world!', c:{d:5,e:'gson'}}";
其中key c下面的object下面的元素不确定,但是解析时也不需要知道c内的具体内容,其实这个问题还是可以解决的。可以通过声明如下的实体类:

public class Bean {    public int getA() {        return a;    }    public void setA(int a) {        this.a = a;    }    private int a;    public String getB() {        return b;    }    public void setB(String b) {        this.b = b;    }    private String b;    public Object getC() {        return c;    }    public void setC(Object c) {        this.c = c;    }    private Object c;}


将c的类型定义为Object,因为一切java object都源自Object。在解析json的代码:
public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        String data = "{a:1, b:'Hello,world!', c:{d:5,e:'gson'}}";        Gson gson = new Gson();        Bean b = gson.fromJson(data, Bean.class);        Log.e("gson", b.getC().toString());        try {            Log.e("gson", "111111");            JSONObject c = new JSONObject(b.getC().toString());            c.put("f", "json");            Log.e("gson", c.toString());        }catch(Exception e) {            e.printStackTrace();        }    }}

或者这样:
public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        String data = "{a:1, b:'Hello,world!', c:{d:'5',e:'gson'}}";        Gson gson = new Gson();        Bean b = gson.fromJson(data, Bean.class);        Log.e("gson", b.getC().toString());        try {            Log.e("gson", "111111");            LinkedTreeMap tm = (LinkedTreeMap)b.getC();            tm.put("f", "json");            Iterator it = tm.keySet().iterator();            while (it.hasNext()) {                String key = (String)it.next();                String value = (String)tm.get(key);                Log.e("gson", "key: " + key + ", value: " + value);            }        }catch(Exception e) {            e.printStackTrace();        }    }}

LinkedTreeMap,可通过key来获取value的map。与TreeMap不同的是,这类使用迭代顺序插入顺序。比较顺序只作为一个优化的有效的插入和去除。它实现了Android 4.1的TreeMap类。所以在获得object对象的时候Gson会把不同的泛型按key和value形式存储起来,使用时只需要对LinkedTreeMap进行遍历即可。


0 0
原创粉丝点击