There is no royal road to learning.

博主:JavaPanda

https://www.cnblogs.com/LearnAndGet/p/10009646.html

目录

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 }
    @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());
}
}

java JSON的使用和解析的更多相关文章

  1. java json 的生成和解析 --json-lib

    类(java json的解析和生成): import java.util.HashMap; import java.util.Map; import net.sf.json.JSONArray; im ...

  2. Java中json的构造和解析

    什么是 Json? JSON(JvaScript Object Notation)(官网网站:http://www.json.org/)是 一种轻量级的数据交换格式.  易于人阅读和编写.同时也易于机 ...

  3. java中json数据生成和解析(复杂对象演示)

    1.json简单介绍 1.1 json是最流行和广泛通用的数据传输格式,简称JavaScript Object Notation,最早在JavaScript中使用. 1.2 举个例子,下面是一个jso ...

  4. java json解析(转)

    转自:https://www.cnblogs.com/sunnywindycloudy/p/8343013.html 给服务端发送请求后,服务端会返回一连串的数据,这些数据在大部分情况下都是XML格式 ...

  5. java使用jackson生成和解析JSON

    java使用jackson生成和解析JSON 1.导包 2.生成json和解析json package test; import com.fasterxml.jackson.core.JsonProc ...

  6. android基础篇------------java基础(11)(文件解析xml and Json )

    一:xml文件解析 首先看一下:我们要解析的内容: <?xml version="1.0" encoding="gbk" ?> - <book ...

  7. JSON三种数据解析方法(转)

    原 JSON三种数据解析方法 2018年01月15日 13:05:01 zhoujiang2012 阅读数:7896    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blo ...

  8. JSON格式之GSON解析

    JSON格式之GSON解析 最近在做websocket相关,项目需要JSON解析.相较之下感觉google的GSON解析不错. JAVA后台 Gson提供了fromJson()方法来实现从Json相关 ...

  9. 4.Java JSON使用

    Java 中 JSON 的使用 分类 编程技术 本章节我们将为大家介绍如何在 Java 语言中使用 JSON. 类库选择 Java中并没有内置JSON的解析,因此使用JSON需要借助第三方类库. 下面 ...

随机推荐

  1. js回调函数的理解

    js回调函数(callback)理解 Mark! 讲之前说一句 function say(){ alert(,,,,,,,,) } var say=function (){ alert(,,,,,,, ...

  2. 支付宝APP支付(基于Java实现支付宝APP支付)

    贴一下支付核心代码,以供后续参考: 业务层 import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; ...

  3. C#-调试记Log文件

    using System.IO; //捕获异常写入Log catch (Exception ex) { string msg = ex.Message + ex.StackTrace; string ...

  4. unittest 运行slenium(四)---通过指定用例的形式运行用例

    一: 说明 跟数据驱动唯一的区别为用例数据获取时,及运行方式不同. 其它都基本相同,可参考https://www.cnblogs.com/xiaodingdong/p/11753220.html 二: ...

  5. Windows——Office使用激活工具激活后仍提示激活

    问题: Office使用激活工具激活后仍提示激活 分析: 造成该问题的原因通常是未删除操作系统预置Office导致的, 解决方案: 调出运行,输入regedit打开注册表编辑器, 依次打开   HKE ...

  6. diff算法实现

    大致流程 var vnode = { tag: 'ul', attrs: { id: 'list' }, children: [{ tag: 'li', attrs: { className: 'it ...

  7. MySQL进阶18- 存储过程- 创建语句-参数模式(in/out/inout-对应三个例子) -调用语法-delimiter 结束标记'$'- 删除/查看/修改-三个练习

    /* MySQL-进阶18 存储过程 和 函数 存储过程和函数:类似于java中的方法 好处: 1.提高代码的重用性 2.简化操作 */ #存储过程 /* 含义: 一组已经预见编译好的SQL语句的集合 ...

  8. P1080 【NOIP 2012】 国王游戏[贪心+高精度]

    题目来源:洛谷 题目描述 恰逢 H国国庆,国王邀请n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王 ...

  9. queue模块笔记

    queue被称为消息队列,数据不会混乱,也可以用于复杂业务传递元素,队列是多线程的利器,其内部有锁的机制可以控制数据的统一且安全 queue.Queue()按照先进先出原则 queue.LifoQue ...

  10. Codeforces Round #609 (Div. 2) D. Domino for Young

    链接: https://codeforces.com/contest/1269/problem/D 题意: You are given a Young diagram. Given diagram i ...