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字符串有对应的类时,对象的解析:
/**
* @Author {LearnAndGet}
* @Time 2018年11月24日
* @Discription:
*/
import java.util.Arrays;
import java.util.HashMap; public class Player {
private String name;
private int age;
private HashMap Hero = new HashMap<String,String>();
private String[] nickNames;
private Honor[] Honors; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public HashMap getHero() {
return Hero;
} public void setHero(HashMap hero) {
Hero = hero;
} public String[] getNickNames() {
return nickNames;
} public void setNickNames(String[] nickNames) {
this.nickNames = nickNames;
} public Honor[] getHonors() {
return Honors;
} public void setHonors(Honor[] honors) {
Honors = honors;
} @Override
public String toString() {
return "Player [name=" + name + ", age=" + age + ", Hero=" + Hero + ", nickNames=" + Arrays.toString(nickNames)
+ ", Honors=" + Arrays.toString(Honors) + "]";
} static class Honor
{
int year;
String name;
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Honor [year=" + year + ", name=" + name + "]";
}
} }
@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的使用和解析的更多相关文章
- Java中json的构造和解析
什么是 Json? JSON(JvaScript Object Notation)(官网网站:http://www.json.org/)是 一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机 ...
- java中json数据生成和解析(复杂对象演示)
1.json简单介绍 1.1 json是最流行和广泛通用的数据传输格式,简称JavaScript Object Notation,最早在JavaScript中使用. 1.2 举个例子,下面是一个jso ...
- Java中JSON字符串与java对象的互换实例详解
这篇文章主要介绍了在java中,JSON字符串与java对象的相互转换实例详解,非常不错,具有参考借鉴价值,需要的朋友可以参考下 在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML.JS ...
- java中 json和bean list map之间的互相转换总结
JSON 与 对象 .集合 之间的转换 JSON字符串和java对象的互转[json-lib] 在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML.JSON等,JSON作为一个轻量级 ...
- (转)Java中JSON字符串与java对象的互换实例详解
在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML.JSON等,JSON作为一个轻量级的数据格式比xml效率要高,XML需要很多的标签,这无疑占据了网络流量,JSON在这方面则做的很好, ...
- Java中JSON字符串与java对象的互换实例详解(转)
http://www.jb51.net/article/90914.htm 在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML.JSON等,JSON作为一个轻量级的数据格式比xml效率要 ...
- Java中 Json的使用
转自:http://huyan.couplecoders.tech/%E5%BC%80%E5%8F%91%E8%80%85%E6%89%8B%E5%86%8C/2018/11/02/Java%E4%B ...
- Java中json工具对比分析
Java中几个json工具分析 1, 环境 JDK1.6+IDE(IntelliJ IDEA)+windowsXP+GBK编码 2,分析对象 jackson1.8.2 http://jackson.c ...
- java中json和字符串互转及日期转换 练习
一:以下是用到的jar名称: commons-beanutils-1.6.jar commons-collections-3.2.1.jar commons-lang-2.6.jar commons- ...
随机推荐
- OpenStack kilo版(1) 部署环境
硬件 VMware workstation虚拟机 Ubuntu14.04操作系统 虚拟机网络规划 管理网络: eth0, 桥接模式 10.0.0.0/24 外部网络: eth1, nat模式(需要关闭 ...
- 2.Redis 入门介绍
A)入门概述: 1.是什么: Redis:REmote Dlctionary Server(远程字典服务器) 是完全开源免费的,用C语言编写的,遵循BSD协议,是一个高性能的(key/value) ...
- 用Python来使用科大讯飞语音识别,so easy
在人工智能高速发展的今天,语音识别技术被带入到人们的工作和生活中,开始被越来越多的人关注和使用,今天,当各种在线客服被机器人客服代替,当速记翻译馆被语音识别代替,甚至当收银员.驾驶员.工厂工人.普通文 ...
- C 全局变量 本地变量
- WdatePicker日期控件使用与值获取,以及选择日期完毕触发事件
踩过无数坑,调试了很长时间,写出适合自己需求的方法需求:没有查询按钮,要求选择日期后自动触发查询事件(只有日期选择完成后才触发), 解决方案:代码如下:检索开始时间: <input type=& ...
- 虚拟机配置双网卡适配器后(桥接和NAT模式),重新打开后两个适配器的ip都没有了(重启网卡报Job for network.service failed because the control process exited with error code)
科普双网卡适配器的好处: 我是配了一个桥接模式的网卡和一个NAT模式的网卡,桥接模式,也就是将虚拟机的虚拟网络适配器与主机的物理网络适配器进行交接,虚拟机中的虚拟网络适配器可通过主机中的物理网络适配器 ...
- jade-包含
模板继承是子文件,父文件继承和代码复用的问题,那模版包含是文件与文件之间,文件与区块之间,这种区块内嵌的东西 继承的关键字是extends, 那模板包含使用的是include这个关键字 head.ja ...
- 正则表达式匹配IP地址
'''首先分析ip地址的特征:255.255.255.255,前三位的数字处理基本一致 1位: 0-9 \d2位:10-99 [1-9]\d3位:100-19 ...
- [Visual Studio] 一些VS2013的使用技巧
作者:h46incon的Blog 1. Peek View 可以在不新建TAB的情况下快速查看.编辑一个函数的代码. 用法:在光标移至某个函数下,按下alt+F12. 然后在Peek窗口里可以继续按a ...
- Java锁--非公平锁
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3496651.html 参考代码 下面给出Java1.7.0_40版本中,ReentrantLock和AQ ...