java中json的使用和解析
阿新 • • 發佈:2018-11-27
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", newString[] { "理髮", "挖掘機" }); 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()); } }