大家好,又见面了,我是你们的朋友全栈君。
1.创建json对象1.1 创建JSONObject对象使用map初始化json
代码语言:javascript代码运行次数:0运行复制 @Test
public void test1()
{
Map
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
代码语言:javascript代码运行次数:0运行复制//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
代码语言:javascript代码运行次数:0运行复制 @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对象,字符串最外层必须为中括号包裹:
代码语言:javascript代码运行次数:0运行复制 @Test
public void test12()
{
String jsonString = "['white','卢本伟','芦苇','卢姥爷']";
JSONArray jsonArray = new JSONArray(jsonString);
for (Object object : jsonArray) {
System.out.println(object);
}
}直接创建JSONArray对象:
创建一个空的JSONArray对象,使用put传值
代码语言:javascript代码运行次数:0运行复制 @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.解析json2.1 官方json包解析 使用官方json包解析时,需要下载json官方jar包,并导入
下载地址(maven仓库):https://mvnrepository.com/artifact/org.json/json/20180813
导入jar包:
代码语言:javascript代码运行次数:0运行复制import org.json.JSONArray;
import org.json.JSONObject;待解析的字符串是简单对象类型,被大括号 { }包围时: 代码语言:javascript代码运行次数:0运行复制 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);
待解析的字符串是数组类型,被中括号 [ ] 包围时:代码语言:javascript代码运行次数:0运行复制 @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);
}
}待解析的字符串既有中括号 [ ]、又有大括号[ ] 包围时,逐层解析代码语言:javascript代码运行次数:0运行复制@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 { 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对象来处理: 代码语言:javascript代码运行次数:0运行复制 @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对象来处理: 代码语言:javascript代码运行次数:0运行复制 @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字符串为混合类型,既有简单对象,又有数组,逐层解析代码语言:javascript代码运行次数:0运行复制 @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字符串有对应的类时,对象的解析: 代码语言:javascript代码运行次数:0运行复制 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 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 代码语言:javascript代码运行次数:0运行复制 @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解析解析普通属性 代码语言:javascript代码运行次数:0运行复制 @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()); } } 解析对象字符串 代码语言:javascript代码运行次数:0运行复制 //省略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()); } } 解析对象数组构成的字符串代码语言:javascript代码运行次数:0运行复制 //省略 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 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/155625.html原文链接:https://javaforall.cn>(){}); for (Person person : persons) { System.out.println(person); } }catch(Exception e) { System.out.println(e.getMessage()); } }