美文网首页JAVA学习爬虫
JSON数据通信--org.json和Gson基本用法

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

作者: androidjp | 来源:发表于2016-09-10 20:04 被阅读455次

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

    一、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<String,Object> map = new HashMap<String, Object>();
        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<array.length();i++){
                System.out.println("major: "+ array.get(i));
            }
        }
    

    三、GSON

    包:com.google.gson

    1.用法:

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

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

    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<Friend> 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<Bean>(){}.getType();
    Bean bean = gson.fromJson(json串,type);
    

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

    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(多了<u> ')]}' </u>这4个字符) 
    .generateNonExecutableJson() 
    //禁止转义html标签 
    .disableHtmlEscaping() 
    //格式化输出 
    .setPrettyPrinting() 
    .create();
    

    相关文章

      网友评论

        本文标题:JSON数据通信--org.json和Gson基本用法

        本文链接:https://www.haomeiwen.com/subject/njneettx.html