1. 程式人生 > >java中json的使用和解析

java中json的使用和解析

1.建立json物件

1.1 建立JSONObject物件

使用map初始化json

    @Test
    public void test1() 
    {    
        Map<String, Object> map = new LinkedHashMap<String, Object>();
        map.put("name", "孫笑川");
        map.put("age", 25);
        map.put("height", 1.70);
        map.put("major", new
String[] { "理髮", "挖掘機" }); map.put("hasGirlFriend", false); map.put("car", null); map.put("house", null); //null作為value時,轉換成json後不會儲存 JSONObject json1 = new JSONObject(map); System.out.println(json1.toString()); Map map2 = json1.toMap(); System.out.println(map2.toString()); }

 

可以看到,當value為null時,轉化為json後不會儲存,會直接拋棄。

  

使用javabean初始化json

//javaBean
class Person {
    public String name;
    public int age;
    public String idCard;
         //省略getter&setter
                }    

//使用javaBean初始化json
    @Test
    public void test2() 
    {
        Person person 
= new Person(); person.setName("孫亞龍"); person.setAge(30); person.setIdCard("512445546565164641212"); JSONObject json2 = new JSONObject(person); System.out.println(json2.toString()); }

 

直接建立JSONObject 

    @Test
    public void test3() 
    {
        JSONObject json3 = new JSONObject();
        Object nullObj = null;
        
        json3.put("name", "孫悟空");
        json3.put("changeTimes", 72);
        json3.put("name", "MonkeySun"); //put方法:value保留原格式,若key相等,value會覆蓋原值
        json3.put("isHuman", false);    
         
        json3.append("nickName", "齊天大聖"); //append方法:value存放在陣列中,若key相等,value會覆蓋原值
        json3.append("nickName", "弼馬溫");
        
        json3.accumulate("Teacher", "元始天尊"); //accmulate方法,和append方法一樣
        json3.accumulate("Teacher", "唐三藏");
        
        
        System.out.println(json3.toString());
    }

 

1.2 建立JSONArray物件

直接從字串獲取:

  用給定的字串初始化JSONArray物件,字串最外層必須為中括號包裹:

    @Test
    public void test12() 
    {
        String jsonString = "['white','盧本偉','蘆葦','盧姥爺']";
        
        JSONArray jsonArray = new JSONArray(jsonString);
        for (Object object : jsonArray) {
            System.out.println(object);
        }
    }

 

 

直接建立JSONArray物件:

  建立一個空的JSONArray物件,使用put傳值

    @Test
    public void test_1() 
    {
        JSONArray jsonArray = new JSONArray();
        //1.put(value)方法 
        jsonArray.put("孫悟空");
        //2.put(index value)方法
        jsonArray.put(1,"{'變化':72,'武器',金箍棒}");
        
        System.out.println(jsonArray);
    }

 

2.解析json

2.1 官方json包解析

  使用官方json包解析時,需要下載json官方jar包,並匯入

  下載地址(maven倉庫):https://mvnrepository.com/artifact/org.json/json/20180813

  匯入jar包:

import org.json.JSONArray;
import org.json.JSONObject;
  • 待解析的字串是簡單物件型別,大括號 { }包圍時:
        @Test
        public void test6() 
        {
            //待解析的json字串
            String jsonString = "{'name':'盧本偉','age':24,'Position':'Mid'}";
            
            //因為json字串是大括號包圍,所以用JSONObject解析
            JSONObject json = new JSONObject(jsonString);    
    
            String name = json.getString("name");
            int age = json.getInt("age");
            String position = json.getString("Position");
            System.out.println("姓名:"+name);
            System.out.println("年齡:"+age);
            System.out.println("位置"+position);                
        }

  • 待解析的字串是陣列型別,被中括號 [  ]  包圍時:
    @Test
    public void test7() 
    {
        //待解析的json字串
        String jsonString = "['盧本偉','white','盧偉','五五開']";
        
        //因為json字串是大括號包圍,所以用JSONArray解析
        JSONArray jsonArray = new JSONArray(jsonString);
        
        //遍歷即可,foreach或for迴圈
        for (Object name : jsonArray) {
            System.out.println(name);
        }
    }

  • 待解析的字串既有中括號 [  ]、又有大括號[  ] 包圍時,逐層解析
@Test
    public void test5() 
    {
        //待解析的json字串
        String jsonString = "{'name':'盧本偉','age':24,'Hero':{'name':'Fizz','Position':'Mid','charactor':'killer'},'nickNames':['五五開','蘆葦','white'],'Honors':[{'year':2011,'name':'TGA總決賽冠軍'},{'year':2013,'name':'S3全球總決賽中國區冠軍'},{'year':2013,'name':'S3全球總決賽亞軍'}]}";
        
        try {
        //因為json字串是大括號包圍,所以用JSONObject解析
        JSONObject json = new JSONObject(jsonString);
        
        /*
         * 普通元素,根據型別直接獲取
         */
        String name = json.getString("name");
        int age = json.getInt("age");
        System.out.println("姓名:"+name);
        System.out.println("年齡:"+age);
        System.out.println("————————————————————————————————");
        
        /*
         * 屬性大括號包括,先獲取JSONObject物件
         */
        JSONObject hero = json.getJSONObject("Hero");
        String hero_name = hero.getString("name");
        String hero_position = hero.getString("Position");
        String hero_charactor = hero.getString("charactor");
        System.out.println("擅長英雄:");
        System.out.println("英雄名:"+hero_name);
        System.out.println("位置:"+hero_position);
        System.out.println("英雄定位:"+hero_charactor);
        System.out.println("————————————————————————————————");
        
        /*
         * 屬性被中括號包括,獲取JSONArray物件,遍歷即可
         */
        System.out.println("外號:");
        JSONArray nickNames = json.getJSONArray("nickNames");
        for (Object nickName : nickNames) {
            System.out.println(nickName);
        }
        System.out.println("————————————————————————————————");
        
        /*
         * 屬性中既有中括號包括,又嵌套了大括號,一層層獲取即可
         */
        JSONArray Honors = json.getJSONArray("Honors");
        System.out.println("所獲榮譽:");
        for(int i=0;i<Honors.length();i++) 
        {
            JSONObject honor = Honors.getJSONObject(i);
            int honor_year = honor.getInt("year");
            String honor_name = honor.getString("name");
            System.out.println(honor_year+" : "+ honor_name);
        }
        }catch(Exception e) 
        {
            System.out.println(e.getMessage());
        }        
    }

2.2 fastjson解析

fastjson是阿里巴巴開源產品之一,解析速度快。

下載地址(maven倉庫):https://mvnrepository.com/artifact/com.alibaba/fastjson/1.2.53

  • JSON字串是簡單物件型別,被大括號包圍:

 當待解析的JSON字串是簡單物件型別的,即用大括號包圍,此時採用JSONObject物件來處理:

    @Test
    public void test3() 
    {
        //簡單物件型別
        String jsonStr = "{'name':'Misaya','position':'Mid','hero':':Twisted Fate'}";
        
        JSONObject json = JSON.parseObject(jsonStr);
        String name = json.getString("name");
        System.out.println(name);
        
        System.out.println(json);
    }

 

 

 

  • JSON字串是陣列型別,被中括號包圍

當待解析的JSON字串是簡單陣列型別的,即用中括號包圍,此時採用JSONArray物件來處理:

    @Test
    public void test4() 
    {
        //陣列型別
        String jsonStr = "['元旦','五一','國慶','春節']";
        
        JSONArray json = JSON.parseArray(jsonStr);
        String first = (String) json.get(0);
        
        System.out.println(first);
        System.out.println(json);
    }

 

  • JSON字串為混合型別,既有簡單物件,又有陣列,逐層解析
    @Test
    public void test5() 
    {
        //混合型別
        String jsonStr = "[{'name':'元旦','vacation':'3'},{'name':'五一','vacation':'7'},{'name':'國慶','vacation':'7'}]";
        
        JSONArray jsonArr = JSON.parseArray(jsonStr);
        
        JSONObject jsonObj1 = jsonArr.getJSONObject(0);
        System.out.println(jsonObj1);
    }

 

  • JSON字串有對應的類時,物件的解析:
 1 /**
 2  * @Author {LearnAndGet}
 3  * @Time 2018年11月24日
 4  * @Discription:
 5  */
 6 import java.util.Arrays;
 7 import java.util.HashMap;
 8 
 9 public class Player {
10     private String name;
11     private int age;
12     private HashMap Hero = new HashMap<String,String>();
13     private String[] nickNames;
14     private Honor[] Honors;
15     
16     public String getName() {
17         return name;
18     }
19 
20     public void setName(String name) {
21         this.name = name;
22     }
23 
24     public int getAge() {
25         return age;
26     }
27 
28     public void setAge(int age) {
29         this.age = age;
30     }
31 
32     public HashMap getHero() {
33         return Hero;
34     }
35 
36     public void setHero(HashMap hero) {
37         Hero = hero;
38     }
39 
40     public String[] getNickNames() {
41         return nickNames;
42     }
43 
44     public void setNickNames(String[] nickNames) {
45         this.nickNames = nickNames;
46     }
47 
48     public Honor[] getHonors() {
49         return Honors;
50     }
51 
52     public void setHonors(Honor[] honors) {
53         Honors = honors;
54     }
55 
56     
57     @Override
58     public String toString() {
59         return "Player [name=" + name + ", age=" + age + ", Hero=" + Hero + ", nickNames=" + Arrays.toString(nickNames)
60                 + ", Honors=" + Arrays.toString(Honors) + "]";
61     }
62 
63 
64     static class Honor
65     {
66         int year;
67         String name;
68         public int getYear() {
69             return year;
70         }
71         public void setYear(int year) {
72             this.year = year;
73         }
74         public String getName() {
75             return name;
76         }
77         public void setName(String name) {
78             this.name = name;
79         }
80         @Override
81         public String toString() {
82             return "Honor [year=" + year + ", name=" + name + "]";
83         }
84     }
85     
86 
87 }
View Code

 

    @Test
    public void Json2Obj() 
    {
        //待解析的json字串
        String jsonString = "{'name':'盧本偉','age':24,'Hero':{'name':'Fizz','Position':'Mid','charactor':'killer'},'nickNames':['五五開','蘆葦','white'],'Honors':[{'year':2011,'name':'TGA總決賽冠軍'},{'year':2013,'name':'S3全球總決賽中國區冠軍'},{'year':2013,'name':'S3全球總決賽亞軍'}]}";
        
        Player p = JSON.parseObject(jsonString, Player.class);
        
        System.out.println(p);
        
    }

2.3 jackson解析

  • 解析普通屬性
        @Test
        public void getCustomProp() 
        {
            String jsonStr = "{\"price\":5000,\"count\":100,\"function\":[{\"name\":\"camera\",\"config\":1500},{\"name\":\"music\",\"config\":2000}]}";
            
            try 
            {
                ObjectMapper objMap = new ObjectMapper();
                
                JsonNode root = objMap.readTree(jsonStr);
                
                //在根節點上的屬性
                int price = root.path("price").asInt();
                int count = root.path("count").asInt();
                System.out.println("price"+":"+price);
                System.out.println("count"+":"+count);
                
                //在葉子節點上的屬性
                JsonNode node = root.path("function");
                String    fun1_name = node.path(0).path("name").asText();
                int fun1_config = node.path(0).path("config").asInt();
                System.out.println("function1:"+fun1_name+":"+fun1_config);
                
                String    fun2_name = node.path(1).path("name").asText();
                int fun2_config = node.path(1).path("config").asInt();
                System.out.println("function2:"+fun2_name+":"+fun2_config);            
            }catch(Exception ex) 
            {
                System.out.println(ex.getMessage());
            }
        }

     

  • 解析物件字串
        //省略javaBean:Person的程式碼
      @Test
    public void json2obj() { String jsonStr = "{\"name\":\"二狗\",\"age\":15,\"idCard\":\"42125\"}"; try { ObjectMapper objMapper = new ObjectMapper();
       //當反序列化json時,未知屬性會引起的反序列化被打斷,這裡我們禁用未知屬性打斷反序列化功能 objMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,
    false); Person p = objMapper.readValue(jsonStr, Person.class); System.out.println(p); }catch(Exception e) { System.out.println(e.getMessage()); } }

     

      
  • 解析物件陣列構成的字串
    //省略 javaBean:Person程式碼
    /* * 解析物件陣列構成的String */ @Test public void jackSonTest() { String jsonStr = "[{\"name\":\"二狗\",\"age\":15,\"idCard\":\"42125\"},{\"name\":\"鐵柱\",\"age\":12,\"idCard\":\"46521\"}]"; try { ObjectMapper mapper = new ObjectMapper(); TreeNode treeNode = mapper.readTree(jsonStr); List<Person> persons = mapper.readValue(jsonStr, new TypeReference<List<Person>>(){}); for (Person person : persons) { System.out.println(person); } }catch(Exception e) { System.out.println(e.getMessage()); } }