JSON的使用及与java对象之间的转换介绍

来源:互联网 发布:如何在淘宝上买东西 编辑:程序博客网 时间:2024/06/05 14:28

toJson

        gson的方法可以分为两类:将对象转换为json,将json解析为对象。

        toJson(Object,Appendable):将json串生成到指定的位置。第二个参数比较常见的如StringBuffer,StringBuilder以及Writer和它的子类。

        toJson(Object):将obj转换为json数据,不能处理基本数据类型,但obj的成员变量可以是基本数据类型。对于集合,返回的是[];对于普通的对象,返回的是{}。

[java] view plain copy
  1. public String toJson(JsonElement jsonElement) {  
  2.     StringWriter writer = new StringWriter();  
  3.     toJson(jsonElement, writer);  
  4.     return writer.toString();  
  5.   }  

        调用的是第一个方法,传入的是StringWriter,所以该方法返回的是String,而上一个方法无返回值。示例如下:

[java] view plain copy
  1. private void gson() {  
  2.       DemoView view = new DemoView("demo11111""jd"100,false);  
  3.       try {  
  4.           File file = new File(getExternalCacheDir(), "1.txt");  
  5.           if(!file.exists())  
  6.               file.createNewFile();  
  7.           FileWriter writer = new FileWriter(file);  
  8.           Log.e(TAG,getExternalCacheDir().getAbsolutePath());  
  9.           new Gson().toJson(view,writer);//将生成  
  10.           writer.flush();  
  11.           writer.close();  
  12.       } catch (Exception e) {  
  13.           e.printStackTrace();  
  14.       }  
  15.   }  

        toJson(Object,Type):type指的是obj的Type类型。平时用的非常少。

        toJson(JsonElement):将一个JsonElement转换为str对象。

        toJson(JsonElement,Appendable):将一个JsonElement转换成的str写入到指定的位置。

        toJsonTree(Object):将obj转换为一个JsonElement。如果对象不是集合,则得到的JsonElement是JsonObject,否则是JsonArray。

fromJson

        fromJson(Sting,Class):将string转换为一个对象。可直接用于将一个JsonObject转换为对象(非集合)。但将一个JsonArray转换为集合时,使用该方法会报错,错误信息如下:

[sql] view plain copy
  1. com.google.gson.internal.LinkedTreeMap cannot be cast xxxxxxxxx  

其主要原因是泛型在运行时会被擦除,所以gson在解析str时无法得知具体的泛型类型。解决方法有二:

        1,可以转换为数组的形式:

[java] view plain copy
  1. DemoView[] json = new Gson().fromJson(s, DemoView[].class);  
  2. Log.e(TAG, s + "," + json.length+ "," + json[0].toString());  

        2,使用GSON提供的TypeToken,如下:

[java] view plain copy
  1. Type type = new TypeToken<List<DemoView>>() {  
  2.   }.getType();  
  3.   List<DemoView> json = new Gson().fromJson(s, type);//其中s是一个JsonArray  
  4.   Log.e(TAG, s + "," + json.get(0).toString());  

        上述方法凡在涉及到泛型时,都会出现总是,不单单是List。如下:

[java] view plain copy
  1. @Override  
  2. protected void onCreate(Bundle savedInstanceState) {  
  3.     super.onCreate(savedInstanceState);  
  4.     setContentView(R.layout.activity_main);  
  5.     Type type = new TypeToken<Outer<Inner>>(){}.getType();  
  6.       Outer outer = new Gson().fromJson("{\"name\":\"haha\",\"test\":{\"age\":\"ag999e\"}}", type);  
  7.     Outer outer = new Gson().fromJson("{\"name\":\"haha\",\"test\":{\"age\":\"ag999e\"}}", Outer.class);  
  8.       
  9.     Log.e(TAG,outer.test.toString());  
  10. }  
  11. private class Outer<T>{  
  12.     String name;  
  13.     T test;  
  14. }  
  15. private class Inner{  
  16.     String age;  
  17.   
  18.     @Override  
  19.     public String toString() {  
  20.         return "age = "+age;  
  21.     }  
  22. }  

        Outer是一个含有泛型的类,如果不使用TypeToken的方式,得到的outer对象将不会将看成一个对象。而使用了TypeToken后,T自动被替换成了Inner对象。

        fromJson(JsonElement,Class):将一个json对象转换为需要的对象。具体处理方式同上。

JsonOblect

        addProperty():为obj添加一个属性。

        add():向obj中添加一个JsonElement对象。

        getAsJsonArray():将属性转换为一个JsonArray对象。

        getAsJsonObject():将属性转换为一个JsonObject对象

        getAsJsonPrimitive():转换为基本数据类型,可以通过内容的isXX以及getAsXXX获取相应的值。

        getAsXXX():虽有这些方法,但都没有实现。所以不能用。

JsonArray

        getAsXXX():转换为自己需要的数据,但数组内部只能有一个元素,否则就会报错。

        size():长度。

JsonObject与Map

        使用Gson时,可以将一个JsonObject对象通过一个Map来接收,Map的key就是JsonObject中的key,value就是JsonObject中对应的value。如下:

[java] view plain copy
  1. Type type = new TypeToken<List<Map<String,String>>>(){}.getType();  
  2.         s = "{\"name\"=\"wangwu\",\"age\":\"22\",\"sex\":1}";  
  3.         String content = "["+s+","+s+","+s+"]";  
  4.         List<Map<String,String>> ms = gson.fromJson(content, type);  
  5.         for(Map<String,String> m: ms){  
  6.             for(String key : m.keySet()){  
  7.                 Log.e("TAGXXYYYXX","key = "+key+",value = "+m.get(key));  
  8.             }  
  9.         }  

        输出结果为:


从中可以看出,每一个s对应的JsonObject都是被一个Map给接收了。并且接收时key,value都是一一对应的。

        就实质上来说,JsonObject本身就是key-value对,能用Map接收也完全说得通。

总结

        string,JsonElement,Object转换如下:

        1,object到string——toJson()

        2,object到JsonElement——toJsonTree()

        3,JsonElement到string——toJson()

        4,JsonElement到Object——fromJson()

        5,string到Object——fromJson()

        6,string到JsonElement——无

原创粉丝点击