Java 多层嵌套JSON类型数据全面解析
作者:简单随风 发布时间:2022-07-18 05:13:05
标签:Java,多层嵌套,JSON,数据
多层嵌套JSON类型数据解析
简单来说:
“key”:“value” --> 此时value为String
“key":0 --> 此时value为int
“key”:{“k1”:“v1”} --> 此时value为JSONObject
“key”:[v] --> 此时value为JSONArray
以下举例数据结构
{
"error": 0,
"status": "success",
"results": [
{
"currentCity": "青岛",
"index": [
{
"title": "穿衣",
"zs": "较冷",
"tipt": "穿衣指数",
"des": "建议着厚外套加毛衣等服装。年老体弱者宜着大衣、呢外套加羊毛衫。"
},
{
"title": "紫外线强度",
"zs": "中等",
"tipt": "紫外线强度指数",
"des": "属中等强度紫外线辐射天气,外出时建议涂擦SPF高于15、PA+的防晒护肤品,戴帽子、太阳镜。"
}
]
}
]
}
解析代码
public class Test {
public static void main(String[] args) {
String s = "{\"error\":0,\"status\":\"success\",\"results\":[{\"currentCity\":\"青岛\",\"index\":[{\"title\":\"穿衣\",\"zs\":\"较冷\",\"tipt\":\"穿衣指数\",\"des\":\"建议着厚外套加毛衣等服装。年老体弱者宜着大衣、呢外套加羊毛衫。\"},{\"title\":\"紫外线强度\",\"zs\":\"最弱\",\"tipt\":\"紫外线强度指数\",\"des\":\"属弱紫外线辐射天气,无需特别防护。若长期在户外,建议涂擦SPF在8-12之间的防晒护肤品。\"}],}]}";
JSONObject jsonObject = JSONObject.fromObject(s);
//提取出error为 0
int error = jsonObject.getInt("error");
System.out.println("error:" + error);
//提取出status为 success
String status = jsonObject.getString("status");
System.out.println("status:" + status);
//注意:results中的内容带有中括号[],所以要转化为JSONArray类型的对象
JSONArray result = jsonObject.getJSONArray("results");
for (int i = 0; i < result.size(); i++) {
//提取出currentCity为 青岛
String currentCity = result.getJSONObject(i).getString("currentCity");
System.out.println("currentCity:" + currentCity);
//注意:index中的内容带有中括号[],所以要转化为JSONArray类型的对象
JSONArray index = result.getJSONObject(i).getJSONArray("index");
for (int j = 0; j < index.size(); j++) {
String title = index.getJSONObject(j).getString("title");
System.out.println("title:" + title);
String zs = index.getJSONObject(j).getString("zs");
System.out.println("zs:" + zs);
String tipt = index.getJSONObject(j).getString("tipt");
System.out.println("tipt:" + tipt);
String des = index.getJSONObject(j).getString("des");
System.out.println("des:" + des);
}
}
}
}
json解析多层嵌套并转为对应类(List)
Json(随便扒的格式,将就看~)
{
"code": 1,
"message": "查询成功",
"data": [
{
"type": 1,
"question": "地层压力与同井深的淡水静液压力之比称为地层的()。",
"answer": "1",
"id": 1,
"description": "题目描述",
"answers": [
{
"isCorrect": "1",
"answer_name": "A的选项内容"
},
{
"isCorrect": "0",
"answer_name": "B的选项内容"
},
{
"isCorrect": 0,
"answer_name": "C的选项内容"
},
{
"isCorect": "0",
"answer_name": "D的选项内容"
}
]
},
{
"type": 1,
"question": "起钻时,产生的抽吸压力导致井底压力()。",
"answer": "1",
"id": 1,
"description": "题目描述",
"answers": [
{
"isCorrect": 1,
"answer_name": "A的选项内容"
},
{
"isCorrect": 0,
"answer_name": "B的选项内容"
},
{
"isCorrect": 0,
"answer_name": "C的选项内容"
},
{
"isCorrect": 0,
"answer_name": "D的选项内容"
}
]
}
]
}
关键依赖
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.72</version>
</dependency>
JSONObject param = testDate();
JSONObject param1 = testHeader("QUERY");
String rDate = HealthServerHandler.getInstance().post(url,param1.toJSONString(), param.toJSONString());
//这个依赖是com.google.code.gson;因为报错原因未知(报错下面图中显示),更换了阿里的依赖
//RecOrder<ResultValue<PurchaseOrder, PageInfo>> recOrder = new Gson().fromJson(rDate, RecOrder.class);
//处理json将类填充,入库
JSONObject rDateJSON = JSONObject.parseObject(rDate);
//这里获取的是"resultValue"标签下面“data”这个JSONArray
JSONArray data = rDateJSON.getJSONObject("resultValue").getJSONArray("data");
//这里获取的是"resultValue"标签下面“pageInfo”这个JSONObject
JSONObject pageInfo = rDateJSON.getJSONObject("resultValue").getJSONObject("pageInfo");
//PurchaseOrder 是具体接收类
List<PurchaseOrder> purchaseOrder = JSONArray.parseArray(data.toString(),PurchaseOrder.class);
PageInfo pageInfo1 = JSONObject.parseObject(pageInfo.toString(),PageInfo.class);
//茵PageInfo与PurchaseOrder并不在同一结构内,需要二次添加
for (PurchaseOrder order : purchaseOrder) {
order.setPageCount(pageInfo1.getPageCount());
order.setPageNum(pageInfo1.getPageNum());
order.setTotal(pageInfo1.getTotal());
order.setPageSize(pageInfo1.getPageSize());
service.saveOrder(order);
}
package jansonDemo;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public class TestJSON {
/**
* JSON实际上也是键值对("key":"value")
* key 必须是字符串,value 可以是合法的 JSON 数据类型(字符串, 数字, 对象, 数组, 布尔值或 null)
* value如果是字符串,用jsonobj.getString("key")获取
* value如果是数 字,用jsonobj.getIntValue("key"),jsonobj.getFloatValue("key"),jsonobj.getInteger("key")等基本数据类型及其包装类的方法获取
* value如果是布尔值,用jsonobj.getBoolean("key"),jsonobj.getBooleanValue("key")获取
* value如果是数 组,用jsonobj.getJSONArray("key")获取
* value如果是Object对象,用jsonobj.get("key"),获取
* value如果是JSONObject对象,用jsonobj.getJSONObject("key")获取
*/
/**
* 该方法用于将已有的json字符串转换为json对象,并取出该对象中相应的key对应的value值
* 将已有的字符串转换成jsonobject,用JSON.parseObject(jsonStr)方法
* json中只要是{}就代表一个JSONObject,[]就代表一个JSONArray
* 获取JSONObject对象用JSONObject jsonobject.getJSONObject("key")方法
* 获取JSONArray对象用JSONObject jsonobject.getJSONArray("key")方法
*/
private static void strWritedToJSONObject() {
//以下是一个json对象中嵌套一个json子对象
String myJsonObj = "{\n" +
" \"name\":\"runoob\",\n" +
" \"alexa\":10000,\n" +
" \"sites\": {\n" +
" \"site1\":\"www.runoob.com\",\n" +
" \"site2\":\"m.runoob.com\",\n" +
" \"site3\":\"c.runoob.com\"\n" +
" }\n" +
"}";
JSONObject jsonobj = JSON.parseObject(myJsonObj); //将json字符串转换成jsonObject对象
/***获取JSONObject中每个key对应的value值时,可以根据实际场景中想得到什么类型就分别运用不到的方法***/
System.out.println(jsonobj.get("name")); //取出name对应的value值,得到的是一个object
System.out.println(jsonobj.getString("name")); //取出name对应的value值,得到的是一个String
System.out.println(jsonobj.getIntValue("alexa")); //取出name对应的value值,得到的是一个int
System.out.println(jsonobj.get("sites")); //取出sites对应的value值,得到的是一个object
System.out.println(jsonobj.getString("sites"));
System.out.println(jsonobj.getJSONObject("sites")); //取出sites对应的value值,得到一个JSONObject子对象
System.out.println(jsonobj.getJSONObject("sites").getString("site2")); //取出嵌套的JSONObject子对象中site2对应的value值,必须用getJSONObject()先获取JSONObject
/**
* 以下是一个json对象中包含数组,数组中又包含json子对象和子数组
*/
String myJsonObj2 = "{\n" +
" \"name\":\"网站\",\n" +
" \"num\":3,\n" +
" \"sites\": [\n" +
" { \"name\":\"Google\", \"info\":[ \"Android\", \"Google 搜索\", \"Google 翻译\" ] },\n" +
" { \"name\":\"Runoob\", \"info\":[ \"菜鸟教程\", \"菜鸟工具\", \"菜鸟微信\" ] },\n" +
" { \"name\":\"Taobao\", \"info\":[ \"淘宝\", \"网购\" ] }\n" +
" ]\n" +
"}";
JSONObject jsonobj2 = JSON.parseObject(myJsonObj2); //将json字符串转换成jsonObject对象
System.out.println(jsonobj2.get("sites"));
System.out.println(jsonobj2.getString("sites"));
System.out.println(jsonobj2.getJSONArray("sites")); //取出sites对应的value值,得到一个JSONOArray对象
//System.out.println(jsonobj2.getJSONObject("sites")); 不能用该方法,因为sites是一个JSONOArray对象
//取出json对象中sites对应数组中第一个json子对象的值
System.out.println(jsonobj2.getJSONArray("sites").getJSONObject(0)); //得到结果:{"name":"Google","info":["Android","Google 搜索","Google 翻译"]}
System.out.println(jsonobj2.getJSONArray("sites").get(0));
System.out.println(jsonobj2.getJSONArray("sites").getString(0));
//取出json对象中sites对应数组中第一个json子对象下面info对应的嵌套子数组值
System.out.println(jsonobj2.getJSONArray("sites").getJSONObject(0).getJSONArray("info")); //得到结果:["Android","Google 搜索","Google 翻译"]
//取出json对象中sites对应数组中第一个json子对象下面info对应的嵌套子数组中第二个值
System.out.println(jsonobj2.getJSONArray("sites").getJSONObject(0).getJSONArray("info").getString(1)); //得到结果:Google 搜索
//依次取出json对象中sites对应数组中的值
JSONArray array = jsonobj2.getJSONArray("sites");
getJsonArrayItem(array);
//依次取出json对象中sites对应数组中第二个json子对象下面info对应的嵌套子数组值
JSONArray arr = jsonobj2.getJSONArray("sites").getJSONObject(1).getJSONArray("info");
getJsonArrayItem(arr);
}
/**
* 手动添加对象到一个JSONObject
*/
private static void writeStrToJSONObject() {
JSONObject jsonObject = new JSONObject();
jsonObject.put("name","tom");
jsonObject.put("age",20);
JSONArray jsonArray = new JSONArray();
JSONObject jsonArrayObject1 = new JSONObject();
jsonArrayObject1.put("name","alibaba");
jsonArrayObject1.put("info","www.alibaba.com");
JSONObject jsonArrayObject2 = new JSONObject();
jsonArrayObject2.put("name","baidu");
jsonArrayObject2.put("info","www.baidu.com");
jsonArray.add(jsonArrayObject1);
jsonArray.add(jsonArrayObject2);
jsonObject.put("sites",jsonArray);
System.out.println(jsonObject);
}
/**
* 将字符串转为JSONArray
*/
private static void strToJsonArray() {
String arrayStr = "[\n" +
" {\n" +
" \"name\":\"alibaba\",\n" +
" \"info\":\"www.alibaba.com\"\n" +
" },\n" +
" {\n" +
" \"name\":\"baidu\",\n" +
" \"info\":\"www.baidu.com\"\n" +
" }\n" +
" ]";
JSONArray array = JSON.parseArray(arrayStr);
System.out.println(array);
}
/**
* 依次取出JSONArray中的值
*/
private static void getJsonArrayItem(JSONArray array) {
for (int i=0; i<array.size(); i++) {
System.out.println(array.get(i));
}
}
//测试类
public static void main(String[] args) {
strWritedToJSONObject();
//writeStrToJSONObject();
//strToJsonArray();
}
}
JAVABEAN转JSONObject
String jsonString=JSONObject.toJSONString(param);
JSONObject jSONObject=JSONObject.parseObject(jsonString);
来源:https://jiandansuifeng.blog.csdn.net/article/details/80700756


猜你喜欢
- 背景分析在项目的开发中,不管是对底层的数据逻辑操作过程,还是业务逻辑的处理过程,还是控制逻辑的处理过程,都不可避免会遇到各种可预知的、不可预
- 本文实例讲述了Android popupWindow弹出窗体实现方法。分享给大家供大家参考,具体如下:1. 建立popupwindow显示的
- 本文实例为大家分享了SpringMVC按Ctrl上传多个文件的具体实现代码,供大家参考,具体内容如下JSP页面注意:必须加入multiple
- 仅供学习交流,禁止商业用途。如侵害利益,联系必删!前言最近一位小伙伴钟爱二次元文化,于是找到半次元这个app,但是很快他就遇到了问题。一、案
- 引言我已经一个多星期没碰过电脑了,今日上班,打开电脑的第一件事就是想着写点什么。反正大家都还沉浸在节后的喜悦中,还没进入工作状态,与其浪费时
- WPF 窗体设置亚克力效果框架使用大于等于.NET40。Visual Studio 2022。项目使用 MIT 开源许可
- kafka作为一个使用广泛的消息队列,很多人都不会陌生,但当你在网上搜索“kafka 延迟队列”,出
- RabbitMQ主要有六种种工作模式,本文整合SpringBoot分别介绍工作模式的实现。前提概念生产者消息生产者或者发送者,使用P表示:队
- 这篇文章主要介绍了如何基于java语言实现八皇后问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- 一、注解(annotations)列表@SpringBootApplication:包含了@ComponentScan、@Configura
- 1,如今NestedScrolling运用到很多地方了,要想好看一点的滑动变换,基本上就是使用这个来完成的,让我们来简单的了解一下。2,Ne
- 一、前言代码死循环这个话题,个人觉得还是挺有趣的。因为只要是开发人员,必定会踩过这个坑。如果真的没踩过,只能说明你代码写少了,或者是真正的大
- 使用简单的fragment实现左侧导航,供大家参考,具体内容如下先上效果图:MainActivity.javapublic class Ma
- 场景:简单工厂时候,我设计了一个场景,有三种剑去打怪,这时候,需求变化了,我三种剑变成了,匕首、剑以及木棒,想要用工厂方法来实现,怎么弄?1
- ijkPlayer 编译全格式支持 .so库基本步骤拉取docker镜像//命令行执行如下命令即可 docker pull adajqd/i
- okio库的类结构okio 主要的接口和类okio接口和类的说明名称类型描述Source接口定义了输入流的几个基本方法BufferedSou
- 需求有时候我们想快速通过http访问本地的一些资源,但是安装一些web服务器又很费时和浪费资源,而且也不是长期使用的。这时候我们可以启动一个
- 目录1、简介2、访问修饰符3、原则总结1、简介访问修饰符是Java语法中很基础的一部分,但是能正确的使用Java访问修饰符的程序员只在少数。
- 问题描述ResultSet 表示 select 语句的查询结果集。ResultSet 对象具有指向其当前数据行的指针, 最初,指针被置于第一
- public string NextString(int charLowerBound, int charUpperBound, int l