Android网络编程之操作JSON对象库-Gson
来源:互联网 发布:linux文件写入权限 编辑:程序博客网 时间:2024/06/05 22:43
之前在Volley框架JsonObjectRequest和JsonArrayRequest的使用中搭配了Gson库,操作JSON数据格式非常方便,所以这里详细阐述下Gson的使用方法。
Gson下载地址:http://code.google.com/p/google-gson/downloads/list
Gson主要提供两种方法:toJson序列化方法以及fromJson反序列化方法。从字面意思可以理解,toJson是将一种数据格式转换为JSON格式,fromJson则是将JSON格式转换为其他数据格式。
1.序列化及反序列化
下面的代码片段列出了封装的集中常见格式的转换
import java.lang.reflect.Type;import java.util.List;import java.util.Map;import com.google.gson.FieldNamingPolicy;import com.google.gson.Gson;import com.google.gson.GsonBuilder;public class GsonUtils { private GsonUtils gsonUtils; public GsonUtils() { // TODO Auto-generated constructor stub } public GsonUtils getInstance() { if (gsonUtils == null) { gsonUtils = new GsonUtils(); } return gsonUtils; } public static Gson getGsonBuilder() { Gson gson = new GsonBuilder()// GSONBUILDER实现更高级的一些序列化反序列化操作 // 自定义JSON序列化反序列化类,实现自己的需求 // .registerTypeAdapter(Id.class, new IdTypeAdapter()) .excludeFieldsWithoutExposeAnnotation() // 不导出实体中没有用@Expose注解的属性 .enableComplexMapKeySerialization() // 支持Map的key为复杂对象的形式 .serializeNulls()// 序列化空字段。默认情况下,GSON省略所有序列化过程中的空字段 .setDateFormat("yyyy-MM-dd HH:mm:ss:SSS")// 时间转化为特定格式 .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)// 会把字段首字母大写,注:对于实体上使用了@SerializedName注解的不会生效. .setPrettyPrinting() // 格式化输出,只影响序列化输出JSON. .disableHtmlEscaping() // 设置显示HTML特殊字符,如< >等等,不设置默认忽略这些字符 .setVersion(1.0) // 高于1.0版本的字段序列化和反序列化的时候忽略 .create(); return gson; } public static Gson getGson() { Gson gson = new Gson(); return gson; } // 各种数据格式转换为JSON public static String toJson(Gson gson, Object object) { String msg = gson.toJson(object); return msg; } // JSON转换为字符串 public static String jsonToString(Gson gson, String string, Type typeOfT) { String msg = gson.fromJson(string, typeOfT); return msg; } // JSON转换为Map public static Map<String, Object> jsonToMap(Gson gson, String string, Type typeOfT) { Map<String, Object> msg = gson.fromJson(string, typeOfT); return msg; } // JSON转换为普通List public static List<Map<String, Object>> jsonToList(Gson gson, String string, Type typeOfT) { List<Map<String, Object>> msg = gson.fromJson(string, typeOfT); return msg; } // JSON转换为List对象 public static List<People> jsonToListB(Gson gson, String string, Type typeOfT) { List<People> msg = gson.fromJson(string, typeOfT); return msg; }}
2.用到的一些数据集合
import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class DataUtils { private static DataUtils dataUtils; public DataUtils() { // TODO Auto-generated constructor stub } public DataUtils getInstance() { if (dataUtils == null) { dataUtils = new DataUtils(); } return dataUtils; } // 获取String数组 public static String[][] getStringArrays() { return new String[][] { { "gaoruan", "22", "true" }, { "xudong", "22", "false", "true" } }; } // 获取map public static Map<String, Object> getMap(String name, int age, int height, boolean isfool) { Map<String, Object> map = new HashMap<String, Object>(); map.put("name", name); map.put("age", age); map.put("height", height); map.put("isfool", isfool); People people1 = new People(); people1.setName("xudong"); people1.setAge(22); people1.setHeight(122); People people2 = new People(); people2.setName("zhangming"); people2.setAge(22); people2.setHeight(122); List<People> list = new ArrayList<People>(); list.add(people1); list.add(people2); map.put("peoples", list); return map; } // 获取list public static List<Map<String, Object>> getList() { List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); list.add(getMap("gaoruan", 22, 122, true)); Map<String, Object> map = getMap("xudong", 22, 122, true); map.put("weight", 222); map.put("ismarried", false); list.add(map); return list; } // 获取list<people> public static List<People> getPeopleList() { List<People> list = new ArrayList<People>(); list.add(new People("xudong", 22, 122, 222, false, true)); People people = new People(); people.setName("gaoruan"); people.setAge(22); people.setHeight(122); list.add(people); return list; }}
3.用到的JavaBean
import com.google.gson.annotations.Expose;import com.google.gson.annotations.SerializedName;import com.google.gson.annotations.Since;import com.google.gson.annotations.Until;public class People { @Expose String name; @Expose(deserialize = false) // 反序列化时删除此字段 default true int age; @Expose(serialize = false) // 序列化时删除此字段 default true int height; @Expose @Since(1.1) // 1.0版本增加此字段 @Until(3.0) // 3.0版本删除此字段 int weight; @Expose @Since(1.1) boolean ismarried; @Expose @SerializedName(value = "fool") // 设置序列化和反序列化时的替代字段名称 boolean isfool; public People() { // TODO Auto-generated constructor stub } public People(String name, int age, int height, int weight, boolean ismarried, boolean isfool) { // TODO Auto-generated constructor stub this.name = name; this.age = age; this.height = height; this.weight = weight; this.ismarried = ismarried; this.isfool = isfool; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getHeight() { return height; } public void setHeight(int height) { this.height = height; } public int getWeight() { return weight; } public void setWeight(int weight) { this.weight = weight; } public boolean isIsmarried() { return ismarried; } public void setIsmarried(boolean ismarried) { this.ismarried = ismarried; } public boolean isIsfool() { return isfool; } public void setIsfool(boolean isfool) { this.isfool = isfool; } @Override public String toString() { return "People [name=" + name + ", age=" + age + ", height=" + height + ", weight=" + weight + ", ismarried=" + ismarried + ", isfool=" + isfool + "]"; }}
4.方法调用Activity
import java.util.List;import java.util.Map;import com.google.gson.Gson;import com.google.gson.reflect.TypeToken;import com.ruan.test.LogUtils;import android.app.Activity;import android.os.Bundle;public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); new GsonUtils().getInstance(); new DataUtils(); // Gson gson = GsonUtils.getGson(); Gson gson = GsonUtils.getGsonBuilder(); // String msg = GsonUtils.toJson(gson, DataUtils.getStringArrays()); // String msg = GsonUtils.toJson(gson, DataUtils.getList()); // String msg = GsonUtils.toJson(gson, DataUtils.getPeopleList()); /** * Map List<Bean> List<Map>与JSON相互转换 */ String msg = GsonUtils.toJson(gson, DataUtils.getMap("gaoruan", 22, 122, true)); Map<String, Object> msg2 = GsonUtils.jsonToMap(gson, msg, new TypeToken<Map<String, Object>>() { }.getType()); LogUtils.e(msg); for (String key : msg2.keySet()) { if (key.equals("peoples")) { // String msg3 = GsonUtils.jsonToString(gson,string, typeOfT) List<People> msg3 = GsonUtils.jsonToListB(gson, msg2.get(key).toString(), new TypeToken<List<People>>() { }.getType()); for (People people : msg3) { LogUtils.e(("name:" + people.getName() + " age:" + people.getAge())); } } else LogUtils.e(("key:" + key + " values:" + msg2.get(key))); } // String msg = GsonUtils.toJson(gson,DataUtils.getList()); // LogUtils.e(msg); // List<Map<String, Object>> msg2 = GsonUtils.jsonToList(gson,msg, new // TypeToken<List<Map<String, Object>>>() { // }.getType()); // for (Map<String, Object> map : msg2) { // for (String key : map.keySet()) { // LogUtils.e(("keys:" + key + " values:" + map.get(key))); // } // // } }}
5.总结
1.Gson主要用作JSON格式数据的序列化反序列化,一些简单的操作例如JSONObject和JSONArray可以完成的没必要套用Gson来操作。
2.敬请期待。
6.源码地址
点我跳转
1 0
- Android网络编程之操作JSON对象库-Gson
- Android网络编程之JSON、GSON
- Android学习之Json解析库Gson
- Android之Gson操作
- Android:JSON 之GSON 解析
- android之GSON解析JSON
- Android JSON之GSON解析
- Android Json处理之Gson
- android,Gson获取多层json对象
- Android网络编程之JSON解析
- 网络编程之Json解析方式与Gson方式解析两兄弟的行为和特点
- Gson操作json字符串和json对象数组
- Gson操作json字符串和json对象数组
- Json解析之Gson库
- Json解析之Gson库
- Android网络之数据解析----使用Google Gson解析Json数据
- Android网络之数据解析----使用Google Gson解析Json数据
- Android网络之数据解析----使用Google Gson解析Json数据
- php rsa加密
- Android 检查设备是否存在 导航栏 NavigationBar
- QNX-pps
- A Scala REST client using the Apache HttpClient library
- 解决mysql大小写敏感的问题
- Android网络编程之操作JSON对象库-Gson
- ListIterator接口
- 操作系统---基础题目汇总四
- java特殊字符处理
- Docker启动报错 symbol dm_task_get_info_with_deferred_remove, version Base not defined
- 关于异常处理的解决方案
- C# 调用Dll 传递字符串指针参数
- Vijos P1034家族【基础并查集】
- 【LeetCode】67Add Binary