JSON数据通信--org.json和Gson基本用法

前言:从这篇文章开始,正式进入本人的网络和数据通信方面的修炼和学习,期间会持续有数据通信相关的学习文章发布。

一、JSON学习网站介绍

  • w3cSchool Json教程
  • JSON官网--有各个语言的json支持相关库介绍

二、org.json基本用法

注意:

  1. json是Android SDK官方的库。
  2. Java中要用到org.json【也就是用到常见的JSONObject或JSONArray类等】,前提是导入 org.json jar包。目前常用的如:org.codeartisans:org.json,也自行上网下载或Maven仓库查找导入。
1. 普通JSONObject对象的构建
public static JSONObject createJson(){
    JSONObject object = new JSONObject();
    object.put("name", "王小明");
    object.put("age", 18.2);
    object.put("birthday", "1990-01-01");
    object.put("school", "蓝翔");
    object.put("major", new String[]{"搬砖","挖掘机"};
    object.put("car",nullObj);
    object.put("comment", "这是注释");
    return object;
}
2. 通过Map,构建json
public static JSONObject createJsonByMap(){
    Map map = new HashMap();
    Object nullObj = null;
    map.put("name", "王小明");
    map.put("age", 18.2);
    map.put("birthday", "1990-01-01");
    map.put("school", "蓝翔");
    map.put("major", new String[]{"搬砖","挖掘机"};
    map.put("car",nullObj);
    map.put("comment", "这是注释");

    return new JSONObject(map);
}
3. 通过Bean对象创建JsonObject对象
// 新建一个Bean对象,并提供getter和setting方法,注意:1.bean对象的成员,是:String、基本数据类型、Object类型
public static JSONObject createJsonByBean(){
    Person xiaoming = new Person();
    xiaoming.setName("王小明");
    //......
    xiaoming.setCar(null);
    //.......
    return new JSONObject(xiaoming);
}
4. 读取.json文件中的内容,并解析成JSONObject对象
//用到:org.apache.commons.io.FileUtils 文件
public static void main(String[] args) throws IOException {
        File file = new File(JsonTest.class.getResource("/basic/json/test.json").getFile());
        String content = readFileToString(file);
        System.out.println(content);
        JSONObject jsonObject = new JSONObject(content);
        if (!jsonObject.isNull("name")) {
            System.out.println(jsonObject.getString("name"));
        }
        JSONArray array = jsonObject.getJSONArray("major");
        for(int i=0;i

三、GSON

包:com.google.gson

1.用法:

  1. 【序列化】解析Bean对象,变成json串
Gson gson = new Gson();
String jsonStr = gson.toJson(bean对象);

复杂对象的情况可以参考以下的反序列化中的复杂类的例子,注意静态内部类的写法。

  1. 【反序列化】json串变成POJO对象
  2. 解析简单类型对象
Gson gson = new Gson();
int i = gson.fromJson("100", int.class);
double d = gson.toJson("\"9.9\"", double.class);
String s = gson.toJson("ABC", String.class);
Bean bean = gson.toJson(json字符串 , Bean.class);//最终转成Object对象
/// ..............................
///其中Bean的成员是简单类型
public class Bean{
  private int id;
  private int age;
  private String name;
  /// getter、setter等
}
  1. 方式二:解析复杂对象
    如果我的Bean对象中的成员带有List<>类型或Object子类等:
public class Bean{
  private int id;
  private int age;
  private Address address;
  private List friends;
  ////自动反序列化的话,必须写成静态内部类的形式!!
  public static class Address{
    public String street;
    public String city;
    public String province;
  }
  public static class Friend{
    public String name;
    public String phoneNumber;
  }
  /// getter、setter等
}

然后,解析方法为:

Gson gson = new Gson();
Bean bean = gson.fromJson(json串, Bean.class);
//或者
Type type = new TypeToken(){}.getType();
Bean bean = gson.fromJson(json串,type);

当Bean对象中存在 List类型或者Set类型,而不是String[]时,GSON同样可以将json串中的数组或集合解析出来,并以GSON默认的集合类型来构建,如下:
* List -> ArrayList
* Set -> LinkedHashSet

  1. Builder监听解析过程
//.....
gsonBuilder.setFieldNamingStrategy(new FieldNamingStrategy(){

    public String translateName(Field f){
        if(f.getName().equals("name")){//改名(注意这里,与注释:@SerialzedName("name")是有冲突的,这个时候,注释优先级更大)
            return "NAME";
        }
        return f.getName();
    }
});
//.....

2. 强大之处:

  1. @SerializedName("NAME")可以将Bean类的成员name,更名为NAME,并转为json,如:
public class Bean{
  @SerializedName("NAME")
  private String name;
  //......
}

在转换时,将得到:

{"NAME": "小明", ……}

而不是

{"name": "小明", ……}
  1. Object转json串过程中,忽略某个属性:
  • 方式一:Bean类中,可以声明一个成员属性,如:private transient String ignore; 这样一来,这个成员属性,就不会被解析成json串当中。
  • 方式二:如果这个成员属性是String或者默认为null的类型,那么, 只要不初始化此属性,默认解析过程中,不会被解析到json串中。
  1. 支持Data日期类型
    Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
  2. GsonBuilder
    通过GsonBuilder配置Gson对象,去达到更多效果的解析:
Gson gson = new GsonBuilder() 
//序列化null 
.serializeNulls() 
// 设置日期时间格式,另有2个重载方法 
// 在序列化和反序化时均生效
 .setDateFormat("yyyy-MM-dd")
 // 禁此序列化内部类 
.disableInnerClassSerialization()
 //生成不可执行的Json(多了 ')]}' 这4个字符) 
.generateNonExecutableJson() 
//禁止转义html标签 
.disableHtmlEscaping() 
//格式化输出 
.setPrettyPrinting() 
.create();

你可能感兴趣的:(JSON数据通信--org.json和Gson基本用法)