Java解析Json字符串--复杂对象(方法一)

 
{
"name": "三班",
"students": [
{
"age": 25,
"gender": "female",
"grades": "三班",
"name": "露西",
"score": {
"网络协议": 98,
"JavaEE": 92,
"计算机基础": 93
},
"weight": 51.3
},
{
"age": 26,
"gender": "male",
"grades": "三班",
"name": "杰克",
"score": {
"网络安全": 75,
"Linux操作系统": 81,
"计算机基础": 92
},
"weight": 66.5
},
{
"age": 25,
"gender": "female",
"grades": "三班",
"name": "莉莉",
"score": {
"网络安全": 95,
"Linux操作系统": 98,
"SQL数据库": 88,
"数据结构": 89
},
"weight": 55
}
]
}

我们来解析一下这个Json字符串。

首先, 最外层由一个大括弧”{}”包裹,那么我们对应的可以建一个实体类来对应,内部有两个元素,元素name比较明显是字符串类型的,元素students的值是由一个中括弧”[]”包裹,那么它对应的应该是一个数组或者列表。

接下来, 我们分析一下中括弧”[]”内部内容格式,中括弧内有三个大括弧包裹着的内容,并且内容格式基本相同,那么我们可以再定义一个实体类来对应这些大括弧。但是我们发现三个大括弧中的内容还是有些区别的,元素score对应的值虽然都是由一个大括弧来包裹,但是里边key的名称和数量都不相同。这样的情况我们不能很好的定义一个实体类来对应这个大括弧内的内容,不过我们可以定义一个Map来对应这个大括弧内的内容。

最终, 定义出来的实体类如下。

Grades.Java

package com.bean;

import java.util.List;

public class Grades {

    private String name;//班级名称
private List<Student> students;//班里的所有学生 public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
} }

Student.java

package com.bean;

import java.util.Map;

/**
* 学生
*/
public class Student { private int age;//年龄
private String gender;//性别,male/female
private String grades;//班级
private String name;//姓名
private Map<String, Integer> score;//各科分数
private float weight;//体重 public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getGrades() {
return grades;
}
public void setGrades(String grades) {
this.grades = grades;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Map<String, Integer> getScore() {
return score;
}
public void setScore(Map<String, Integer> score) {
this.score = score;
}
public float getWeight() {
return weight;
}
public void setWeight(float weight) {
this.weight = weight;
} }

定义完之后,解析过程就非常简单了:

package com.test;

import net.sf.json.JSONObject;

import com.bean.Grades;

public class Domain {

    public static void main(String[] args) {

        String jsonStr = "{\"name\":\"三班\",\"students\":[{\"age\":25,\"gender\":\"female\",\"grades\":\"三班\",\"name\":\"露西\",\"score\":{\"网络协议\":98,\"JavaEE\":92,\"计算机基础\":93},\"weight\":51.3},{\"age\":26,\"gender\":\"male\",\"grades\":\"三班\",\"name\":\"杰克\",\"score\":{\"网络安全\":75,\"Linux操作系统\":81,\"计算机基础\":92},\"weight\":66.5},{\"age\":25,\"gender\":\"female\",\"grades\":\"三班\",\"name\":\"莉莉\",\"score\":{\"网络安全\":95,\"Linux操作系统\":98,\"SQL数据库\":88,\"数据结构\":89},\"weight\":55}]}";

        JSONObject jsonObject = JSONObject.fromObject(jsonStr);

        Grades grades = (Grades) JSONObject.toBean(jsonObject, Grades.class);

    }
}

Java解析Json字符串--复杂对象(方法二)

1. JSON 字符串,如下所示:

{"DevEUI_uplink":
{ "Time": "2018-11-03T12:46:27.665+08:00",
"DevEUI": "1000FF000B000002",
"FPort": "2","FCntUp": "5","ADRbit": "1",
"MType": "4","FCntDn": "6",
"payload_hex": "810100ffff0c4b4807000003f7f985ffffffff1401000005040101bb2d",
"mic_hex": "b3aed8f1","Lrcid": "00000065","LrrRSSI": "-100.000000","LrrSNR": "1.500000",
"SpFact": "11","SubBand": "G0","Channel": "LC3","DevLrrCnt": "3","Lrrid": "00010016","Late": "0","LrrLAT": "0.000000","LrrLON": "0.000000",
"Lrrs": {
"Lrr": [
{"Lrrid": "00010016","Chain": "0","LrrRSSI": "-100.000000","LrrSNR": "1.500000","LrrESP": "-102.324738"},
{"Lrrid": "0001001A","Chain": "0","LrrRSSI": "-107.000000","LrrSNR": "-2.000000","LrrESP": "-111.124428"},
{"Lrrid": "00010014","Chain": "0","LrrRSSI": "-109.000000","LrrSNR": "-14.500000","LrrESP": "-123.651421"}
]
},
"CustomerID": "100000017",
"CustomerData": {"alr":{"pro":"FOXCONN/dBoard","ver":"1"}},
"ModelCfg": "0",
"DevAddr": "0326001C"
}
}

2. 解析成Javabean:

注意:对于复杂的json字符串解析,有时候,net.sf.json.JSONObject解析会失败,可以使用 com.google.gson.Gson解析

import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser; @Test
public void testParseJsonStr() {
String jsonStr = "{\"DevEUI_uplink\": {\"Time\": \"2018-11-03T12:46:22.382+08:00\",\"DevEUI\": \"1000FF000B000002\",\"FPort\": \"2\",\"FCntUp\": \"4\",\"ADRbit\": \"1\",\"MType\": \"4\",\"FCntDn\": \"5\",\"payload_hex\": \"810100ffff0c4b4807000003f7f985ffffffff14010000040301011890\",\"mic_hex\": \"7873fd23\","
+ "\"Lrcid\": \"00000065\",\"LrrRSSI\": \"-100.000000\",\"LrrSNR\": \"2.500000\",\"SpFact\": \"11\",\"SubBand\": \"G0\",\"Channel\": \"LC4\",\"DevLrrCnt\": \"5\",\"Lrrid\": \"00010016\",\"Late\": \"0\",\"LrrLAT\": \"0.000000\",\"LrrLON\": \"0.000000\","
+ "\"Lrrs\": {\"Lrr\": [{\"Lrrid\": \"00010016\",\"Chain\": \"0\",\"LrrRSSI\": \"-100.000000\",\"LrrSNR\": \"2.500000\",\"LrrESP\": \"-101.937759\"},{\"Lrrid\": \"0001001E\",\"Chain\": \"0\",\"LrrRSSI\": \"-102.000000\",\"LrrSNR\": \"-1.750000\",\"LrrESP\": \"-105.972855\"},{\"Lrrid\": \"0001000F\",\"Chain\": \"0\",\"LrrRSSI\": \"-105.000000\",\"LrrSNR\": \"-15.000000\",\"LrrESP\": \"-120.135208\"}]},\"CustomerID\": \"100000017\",\"CustomerData\": {\"alr\":{\"pro\":\"FOXCONN/dBoard\",\"ver\":\"1\"}},\"ModelCfg\": \"0\",\"DevAddr\": \"0326001C\"}}"; JSONObject jsonObj = JSONObject.fromObject(jsonStr);
Object object = jsonObj.get("DevEUI_uplink");
//System.out.println("****" + object.toString()); JsonObject obj = new JsonParser().parse(object.toString()).getAsJsonObject();
ReceviceDataModel rd1 = new Gson().fromJson(obj, ReceviceDataModel.class);
System.out.println("---rd1:" + rd1.toString());
LrrModel[] lrrModels = rd1.getLrrs().get("Lrr");
System.out.println("----" + lrrModels[1].toString()); }

3. JavaBean定义:

public class ReceviceDataModel extends BaseDtoAdapter {

    private static final long serialVersionUID = -3587750514661171087L;

    private Date Time;
private String DevEUI;
private Integer FPort;
private Integer FCntUp;
private Integer FCntDn;
private String ADRbit;
private String MType;
private String payload_hex;
private String mic_hex;
private String Lrcid;
private String LrrRSSI;
private String LrrSNR;
private String SpFact;
private String SubBand;
private String Channel;
private String DevLrrCnt;
private Map<String, LrrModel[]> Lrrs;
private String CustomerID;
private Map<String, AlrModel> CustomerData;
private String ModelCfg;
private String DevAddr; get....
set.... } public class LrrModel extends BaseDtoAdapter { private static final long serialVersionUID = 3105745288168791895L; private String Lrrid;
private String Chain;
private String LrrRSSI;
private String LrrSNR;
private String LrrESP; get....
set....
} public class AltModel extends BaseDtoAdapter { private static final long serialVersionUID = 7019821138967165678L; private String pro;
private String ver; get...
set...
}


java解析复杂的json字符串的更多相关文章

  1. 【Java_Spring】java解析多层嵌套json字符串

    java解析多层嵌套json字符串    

  2. java解析多层嵌套json字符串

    java分别解析下面两个json字符串 package jansonDemo; import com.alibaba.fastjson.JSON; import com.alibaba.fastjso ...

  3. JAVA 解析复杂的json字符串

    转自:https://blog.csdn.net/lovelovelovelovelo/article/details/73614473String parameter = { success : 0 ...

  4. <摘录>Gson对Java嵌套对象和JSON字符串之间的转换

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,具有良好的跨平台特性.近几年来已经和XML一样成为C/S架构中广泛采用的数据格式.有关JSON的更多知识, ...

  5. Java实现微信菜单json字符串拼接

    Java实现微信菜单json字符串拼接 微信菜单拼接json字符串方法 >>>>>>>>>>>>>>>> ...

  6. AJAX html 传输json字符串&&巧妙运用eval()来解析返回的JSON字符串

    1.AJAX html 传输json字符串: js方法如下: function saveRetYwlsh(){ var xmbh = document.getElementById("xmb ...

  7. Java对象转换成Json字符串是无法获得对应字段名

    问题: 代码中已经标注 @JSONField(name = "attrs") private String abc; public String getA() { return a ...

  8. js中JSON的解析(将json字符串转化为对象)和序列化(将对象转化为json字符串)(函数的功能一般都挺全的,需要的时候去查看完整函数)

    js中JSON的解析(将json字符串转化为对象)和序列化(将对象转化为json字符串)(函数的功能一般都挺全的,需要的时候去查看完整函数) 一.总结 1.JSON解析:JSON.parse(myJS ...

  9. Qt平台下使用QJson解析和构建JSON字符串

    前言 上一篇介绍了C语言写的JSON解析库cJSON的使用:使用cJSON库解析和构建JSON字符串 本篇文章介绍,Qt开发环境下QJson库的使用示例,JSON解析配合API接口,就可以实现一些有趣 ...

随机推荐

  1. new的原理及实现

    new的过程 // new运算的过程 /** * 1.创建一个空对象: * 2.该空对象的原型指向构造函数(链接原型):将构造函数的 prototype 赋值给对象的 __proto__属性: * 3 ...

  2. 实验吧——因缺思汀的绕过(sql with rollup)

    题目地址:http://ctf5.shiyanbar.com/web/pcat/index.php 通读源码,得知出flag的条件 1.需要post提交uname以及pwd,否则直接die了 if ( ...

  3. java获取客户端请求IP地址(公网ip)

    之前写了一个获取ip地址的方法,但是放网上一查显示此Ip地址是局域网ip地址,要是想获取请求端的真实公网ip地址怎么样了,看了一些别人的博客后发现,想要获取客户端的公网ip必须借助第三方. packa ...

  4. I still have a dream!

    当聊起梦想时,哥总会说别跟我谈梦想,我已经戒了!现在的我对梦想并不感冒,总是冷眼旁观很多事情,那些经不起时间检验的事和人,总会消散在历史云烟中,若干年后,又有谁还会记得那些遗弃在历史尘埃中,琐碎的芝麻 ...

  5. 源码安装rlwrap 0.43(为了方便使用linux下的sqlplus)

    为了linux下的sqlplus方便调用历史命令和退格,安装下rlwrap,最新版本是0.43,貌似作者已经不更新了 下载地址 https://fossies.org/linux/privat/rlw ...

  6. 【学习笔记】大数据技术原理与应用(MOOC视频、厦门大学林子雨)

    1 大数据概述 大数据特性:4v volume velocity variety value 即大量化.快速化.多样化.价值密度低 数据量大:大数据摩尔定律 快速化:从数据的生成到消耗,时间窗口小,可 ...

  7. MySQL Execution Plan--使用Query Rewrite

    安装Query Rewrite Plugin 在MySQL的安装目录的share文件夹下,有两个文件用来安装和卸载Query Rewrite Plugin: install_rewriter.sql: ...

  8. hadoop hdfs 有内网、公网ip后,本地调试访问不了集群解决

    问题背景: 使用云上的虚拟环境搭建测试集群,导入一些数据,在本地idea做些debug调试,但是发现本地idea连接不上测试环境 集群内部配置hosts映射是内网映射(内网ip与主机名映射),本地只能 ...

  9. React源码 ReactDOM.render

    在 react 当中,主要创建更新的有三种方式 1.ReactDOM.render || hydrate  这两个api都是要把这个应用第一次渲染到我们页面上面,展现出来整个应用的样子的过程,这就是初 ...

  10. 使用cookiecutter创建django项目

    使用cookiecutter创建django项目 下载安装: pip install cookiecutter cookiecutter https://github.com/pydanny/cook ...