java中json數據生成和解析(復雜對象演示)


1.json簡單介紹

  1.1 json是最流行和廣泛通用的數據傳輸格式,簡稱JavaScript Object Notation,最早在JavaScript中使用.

  1.2 舉個例子,下面是一個json對象,名字叫王尼瑪,他有兩個粉絲組成數組,一個叫小王,一個叫小尼瑪:

    {

      "name":"王尼瑪",

      "fans":[{

            "name":"小王",

            "age":"7"

           },{

            "name":"小尼瑪",

            "age":"10"

           }]

      }

2.json數據生成和解析

  2.1 關於json處理的包有好幾類,開源jackson,谷歌Gson,阿里巴巴的Fastjson.Gson功能強大,但是Fastjson性能更快.如何選擇見仁見智就行

  2.2 這里我開始都是用org.json,后面為了演示復雜json轉java bean又導入了功能強大的Gjson,先附上兩個maven依賴:

    <!-- https://mvnrepository.com/artifact/org.json/json -->
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20160810</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.7</version>
        </dependency>

  2.3 json數據的生成,也就是各種類型轉json.(String,map和java bean)

DemoCreateJson.java
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by garfield on 2016/10/16.
 * 舉三種創建json的例子
 */
public class DemoCreateJson {
    public static void main(String[] args) {
        StringCreateJson();
        mapCreateJson();
        beanCreateJson();
    }
    //String創建json
    /**
     * {
           "name":"王尼瑪",
           "fans":[{
                 "name":"小王",
                 "age":"7"
                },{
                 "name":"小尼瑪",
                 "age":"10"
                }]
           }
     */
    static void StringCreateJson(){
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("name","王尼瑪");

        //粉絲是個數組,其實就是嵌套json
        JSONObject jsonObject1 = new JSONObject();
        jsonObject1.put("name","小王");
        jsonObject1.put("age",7);

        JSONObject jsonObject2 = new JSONObject();
        jsonObject2.put("name","小尼瑪");
        jsonObject2.put("age",10);

        //從此處可以看出其實list和json也是互相轉換的
        List<JSONObject> jsonObjects = new ArrayList<JSONObject>();
        jsonObjects.add(jsonObject1);
        jsonObjects.add(jsonObject2);
        jsonObject.put("fans",jsonObjects);

        System.out.println("jsonObject直接創建json:" + jsonObject);
    }
    //第二種方法,用map方式
    static void mapCreateJson(){
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("name","王尼瑪");
        Map<String,Object> map1 = new HashMap<String,Object>();
        map1.put("name","小王");
        map1.put("age",7);
        Map<String,Object> map2 = new HashMap<String,Object>();
        map2.put("name","小尼瑪");
        map2.put("age",10);
        List<Map> jsonObjects = new ArrayList<Map>();
        jsonObjects.add(map1);
        jsonObjects.add(map2);
        map.put("fans",jsonObjects);
        System.out.println("集合中Map創建json對象:" + new JSONObject(map));
    }
    //第三種,也是比較常用的,用bean轉換,(這里用的是map作為子json,如果必須要創建復雜bean對象,建議用Gjson操作)
    static void beanCreateJson(){
        Actor actor = new Actor();
        actor.setName("王尼瑪");
        Map<String,Object> map1 = new HashMap<String,Object>();
        map1.put("name","小王");
        map1.put("age",7);
        Map<String,Object> map2 = new HashMap<String,Object>();
        map2.put("name","小尼瑪");
        map2.put("age",10);
        List<Map> maps = new ArrayList<Map>();
        maps.add(map1);
        maps.add(map2);
        actor.setFans(maps);
        System.out.println("java bean創建json對象:" + new JSONObject(actor));
    }
}

    2.3.1上面類缺少基本bean

Actor.java

import java.util.List;
import java.util.Map;

/**
 * Created by garfield on 2016/10/16.
 */
public class Actor {
    private String name;
    private List<Map> fans;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Map> getFans() {
        return fans;
    }

    public void setFans(List<Map> fans) {
        this.fans = fans;
    }

}

  2.4 json的解析,這里寫了兩種解析方式,同樣,比較常用的還是第二種,json轉java bean

DemoParseJson.java

import com.google.gson.*;
import org.json.JSONObject;

import java.util.Map;

/**
 * Created by garfield on 2016/10/16.
 */
public class DemoParseJson {
    public static void main(String[] args) {
        String jsonString = "{\"fans\":[{\"name\":\"小王\",\"age\":7},{\"name\":\"小尼瑪\",\"age\":10}],\"name\":\"王尼瑪\"}";
        normalParse(jsonString);
        beanParse(jsonString);
    }
    static void normalParse(String jsonString){
        JSONObject jsonObject = new JSONObject(jsonString);
        //獲取普通屬性
        System.out.println("姓名:");
        System.out.println("  " + jsonObject.getString("name"));
        //獲取數組
        System.out.println("粉絲:");
        for (Object fan : jsonObject.getJSONArray("fans")) {
            JSONObject object = (JSONObject)fan;
            System.out.println("  姓名:" + object.get("name") + ",年齡:" + object.get("age"));
        }
    }
    //org.json並不支持這種復雜的bean轉換,所以這邊又導入了gson的包
    static void beanParse(String jsonString){
        System.out.println("=========Gson解析=========");
        JsonObject obj = new JsonParser().parse(jsonString).getAsJsonObject();
        Actor actor = new Gson().fromJson(obj,Actor.class);
        System.out.println("姓名:");
        System.out.println("  " + obj.get("name"));
        System.out.println("粉絲:");
        for (Map map : actor.getFans()) {
            System.out.println("  姓名:" + map.get("name") + "年齡:" + map.get("age"));
        }
    }
}

  2.4.1順便附上執行結果:

姓名:
  王尼瑪
粉絲:
  姓名:小王,年齡:7
  姓名:小尼瑪,年齡:10
=========Gson解析=========
姓名:
  "王尼瑪"
粉絲:
  姓名:小王年齡7.0
  姓名:小尼瑪年齡10.0

ok,that's it...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM