Json、Gson的基本用法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dangnianmingyue_gg/article/details/53434875

什么是JSON

JSON即JavaScript Object Natation, 它是一种轻量级的数据交换格式, 与XML一样, 是广泛被采用的客户端和服务端交互的解决方案.

JSON对象:

JSON中对象(Object)以”{“开始, 以”}”结束. 对象中的每一个item都是一个key-value对, 表现为”key:value”的形式, key-value对之间使用逗号分隔. 如:{“name”:”coolxing”, “age”=24, “male”:true, “address”:{“street”:”huiLongGuan”, “city”:”beijing”, “country”:”china”}}. JSON对象的key只能是string类型的, 而value可以是string, number, false, true, null, Object对象甚至是array数组, 也就是说可以存在嵌套的情况.

JSON数组:

JSON数组(array)以”[“开始, 以”]”结束, 数组中的每一个元素可以是string, number, false, true, null, Object对象甚至是array数组, 数组间的元素使用逗号分隔. 如[“coolxing”, 24, {“street”:”huiLongGuan”, “city”:”beijing”, “country”:”china”}].

JSONObject, JSONArray来构建json文本

    // 假设现在要创建这样一个json文本    
    //  {    
    //      "phone" : ["12345678", "87654321"], // 数组    
    //      "name" : "yuanzhifei89", // 字符串    
    //      "age" : 100, // 数值    
    //      "address" : { "country" : "china", "province" : "jiangsu" }, // 对象    
    //      "married" : false // 布尔值    
    //  }    

    try {    
        // 首先最外层是{},是创建一个对象    
        JSONObject person = new JSONObject();    
        // 第一个键phone的值是数组,所以需要创建数组对象    
        JSONArray phone = new JSONArray();    
        phone.put("12345678").put("87654321");    
        person.put("phone", phone);    

        person.put("name", "yuanzhifei89");    
        person.put("age", 100);    
        // 键address的值是对象,所以又要创建一个对象    
        JSONObject address = new JSONObject();    
        address.put("country", "china");    
        address.put("province", "jiangsu");    
        person.put("address", address);      
        person.put("married", false);    
    } catch (JSONException ex) {    
        // 键为null或使用json不支持的数字格式(NaN, infinities)    
        throw new RuntimeException(ex);    
    }     

getType和optType api的使用

getType可以将要获取的键的值转换为指定的类型,如果无法转换或没有值则抛出JSONException 

optType也是将要获取的键的值转换为指定的类型,无法转换或没有值时返回用户提供或这默认提供的值 
    try {    
        // 所有使用的对象都是用上面创建的对象    
        // 将第一个电话号码转换为数值和将名字转换为数值    
        phone.getLong(0);    
        person.getLong("name"); // 会抛异常,因为名字无法转换为long          
        phone.optLong(0); // 代码内置的默认值    
        phone.optLong(0, 1000); // 用户提供的默认值    
        person.optLong("name");    
        person.optLong("name", 1000); // 不像上面那样抛异常,而是返回1000    
    } catch (JSONException ex) {    
        // 异常处理代码    
    }    

使用JSONStringer来构建json文本

    try {    
        JSONStringer jsonText = new JSONStringer();    
        // 首先是{,对象开始。object和endObject必须配对使用    
        jsonText.object();    

        jsonText.key("phone");    
        // 键phone的值是数组。array和endArray必须配对使用    
        jsonText.array();    
        jsonText.value("12345678").value("87654321");    
        jsonText.endArray();    

        jsonText.key("name");    
        jsonText.value("yuanzhifei89");    
        jsonText.key("age");    
        jsonText.value(100);    

        jsonText.key("address");    
        // 键address的值是对象    
        jsonText.object();    
        jsonText.key("country");    
        jsonText.value("china");    
        jsonText.key("province");    
        jsonText.value("jiangsu");    
        jsonText.endObject();    

        jsonText.key("married");    
        jsonText.value(false);    

        // },对象结束    
        jsonText.endObject();    
    } catch (JSONException ex) {    
        throw new RuntimeException(ex);    
    }    

将json文本解析为对象

    //  {    
    //      "phone" : ["12345678", "87654321"], // 数组    
    //      "name" : "yuanzhifei89", // 字符串    
    //      "age" : 100, // 数值    
    //      "address" : { "country" : "china", "province" : "jiangsu" }, // 对象    
    //      "married" : false // 布尔值    
    //  }    

    private static final String JSON =     
    "{" +    
        "   \"phone\" : [\"12345678\", \"87654321\"]," +    
        "   \"name\" : \"yuanzhifei89\"," +    
        "   \"age\" : 100," +    
        "   \"address\" : { \"country\" : \"china\", \"province\" : \"jiangsu\" }," +    
        "   \"married\" : false," +    
    "}";    

    try {    
        JSONTokener jsonParser = new JSONTokener(JSON);    
        // 此时还未读取任何json文本,直接读取就是一个JSONObject对象。    
        // 如果此时的读取位置在"name" : 了,那么nextValue就是"yuanzhifei89"StringJSONObject person = (JSONObject) jsonParser.nextValue();    
        // 接下来的就是JSON对象的操作了    
        person.getJSONArray("phone");    
        person.getString("name");    
        person.getInt("age");    
        person.getJSONObject("address");    
        person.getBoolean("married");    
    } catch (JSONException ex) {    
        // 异常处理代码    
    }    

其它的api基本就是用来查看json文本中的文本的

try {    
    JSONTokener jsonParser = new JSONTokener(JSON);    
    // 继续向下读8个json文本中的字符。此时刚开始,即在{处    
    jsonParser.next(8); //{    "phone。tab算一个字符    

    // 继续向下读1个json文本中的字符    
    jsonParser.next(); //"    

    // 继续向下读取一个json文本中的字符。该字符不是空白、同时也不是注视中的字符    
    jsonParser.nextClean(); //:    

    // 返回当前的读取位置到第一次遇到'a'之间的字符串(不包括a)。    
    jsonParser.nextString('a'); //  ["12345678", "87654321"],    "n(前面有两个空格)    

    // 返回当前读取位置到第一次遇到字符串中(如"0089")任意字符之间的字符串,同时该字符是trimmed的。(此处就是第一次遇到了89)    
    jsonParser.nextTo("0089"); //me" : "yuanzhifei    

    // 读取位置撤销一个    
    jsonParser.back();    
    jsonParser.next(); //i    

    // 读取位置前进到指定字符串处(包括字符串)    
    jsonParser.skipPast("address");    
    jsonParser.next(8); //" : { "c    

    // 读取位置前进到执行字符处(不包括字符)    
    jsonParser.skipTo('m');    
    jsonParser.next(8); //married"    
} catch (JSONException ex) {    
    // 异常处理代码    
}   

Gson的基本使用方法:

1.基础用法toJson

toJason()方法将对象转换成Json字符串

Gson gson = new Gson();

List persons = new ArrayList();

String str = gson.toJson(persons);

2.基础用法:fromJson()

Gson提供了fromJson()方法来实现从Json字符串转化为到java实体的方法。

比如json字符串为:[{“name”:”name0”,”age”:0}]

Person person = gson.fromJson(str, Person.class);

提供两个参数,分别是json字符串以及需要转换对象的类型。
如果需要解析的是一段JSON 数组会稍微麻烦一点,需要借助TypeToken 将期望解
析成的数据类型传入到fromJson()方法中,如下所示:

List<Person> people = gson.fromJson(jsonData, new TypeToken<List<Person>>(){}.getType());

3.避免Unicode转义

例如:
{"s":"\u003c"}
我只想简单的打印成这样
{"s":"<"}
解决方案:
我只需要 disable HTML escaping.
Gson gson = new GsonBuilder().disableHtmlEscaping().create();

4.排除某些字段

如果一个类A中含有字段field1,它的父类也含有字段field1,那么A对象toJson的时候,就会发生declares multiple JSON fields named field1。
解决方案1:在类A中去掉字段filed1.
解决方案2:使用Json@Expose注解
将A类MessageText中需要打印的字段filed1加上注解@Expose 。那么父类中没有加注解的field1就会被排除掉。
Gson g = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();

5.换属性名字

public class SomeClassWithFields {
   @SerializedName("name") 
   private final String someField;
   private final String someOtherField;

   public SomeClassWithFields(String a, String b) {
     this.someField = a;
     this.someOtherField = b;
   }
 }
SomeClassWithFields objectToSerialize = new SomeClassWithFields("a", "b");
 Gson gson = new Gson();
 String jsonRepresentation = gson.toJson(objectToSerialize);
 System.out.println(jsonRepresentation);

 ===== OUTPUT =====
 {"name":"a","someOtherField":"b"}

6.泛型的用法

HashMap<String, Book> booksMap = gson.fromJson(result, new TypeToken<HashMap>String, Book>() { }.getType());

猜你喜欢

转载自blog.csdn.net/dangnianmingyue_gg/article/details/53434875