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. i春秋——“百度杯”CTF比赛 十月场——Login

    根据页面源码提示的 test1 test1 登录 刷新此页面并抓包,有个show=0值得关注 在发送的包的header中加一句show:1,即可得到member.php的源码 <?php inc ...

  2. testNG结果入库

    一.使用IReporter接口 https://blog.csdn.net/oqqJohn1234567890/article/details/80900511  此文章中将结果数据打印成文本.

  3. sigprocmask阻塞信号

    有时候不希望在接到信号时就立即停止当前执行,去处理信号,同时也不希望忽略该信号,而是延时一段时间去调用信号处理函数 1. 信号阻塞和忽略信号的区别 操作系统在信号被进程解除阻塞之前不会将信号传递出去, ...

  4. 记录一个h5页面生成canvas画布做签名的js插件--signature_pad

    demo地址:https://jsfiddle.net/02dLn15g/5/ GitHub地址:https://github.com/szimek/signature_pad 配置项: dotSiz ...

  5. Elasticsearch 在 7.X版本中去除type的概念

    背景说明 Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎.无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进.性能最好的.功能最全的搜索引擎库. El ...

  6. Linux Tomcat安装及端口配置

    1.  JDK安装配置 待写 2. Tomcat安装配置 1,下载Tomcat链接,到启动测试. 将文件apache-tomcat-8.5.50.tar.gz移动到/usr/tomcat/下,并解压 ...

  7. 如何使用Activator.CreateInstance创建一个列表<T>,其中T在运行时是未知的?

    参考网址:https://cloud.tencent.com/developer/ask/185965 using System; using System.Collections.Generic; ...

  8. IIS添加MIME类型.woff/.svg/.woff2/.eot/.otf.ttf

    IIS添加MIME类型: 文件扩展名 MIME类型 .svg     image/svg+xml.woff   application/x-font-woff.woff2 application/x- ...

  9. ESA2GJK1DH1K基础篇: Android实现SmartConfig简单Demo

    下载源码去 百度安信可 导入源码 等待加载完 我的提示更新下软件 ,我就更新下 安装完成以后重新导入工程 安装到手机 注意,由于Android 9.0 以后的获取WIFI名称需要打开GPS,所以如果提 ...

  10. gnome 3 插件设置

    插件安装及管理方法 应该需提前在gnome-tweaks中打开user-theme,重启电脑后才可找到Add-ons Debian9 下在应用商店插件add-ons里进行选择安装,在应用商店已安装应用 ...