java数组里套数组_用JAVA进行Json数据解析(对象数组的相互嵌套)

这段时间我们在做一个英语翻译软件的小小小APP,涉及到了对Json数据的解析,所以特地来总结一下!

假设我们要对如下数据进行解析,其实在平时,返回的Json数据是很乱的,很难分清数据的关系,这是经过相关工具美化后的结果

{

"translation": [

"爱"

],

"basic": {

"us-phonetic": "lʌv",

"phonetic": "lʌv",

"uk-phonetic": "lʌv",

"explains": [

"n. 恋爱;亲爱的;酷爱;喜爱的事物",

"vt. 喜欢;热爱;爱慕",

"vi. 爱",

"n. (Love)人名;(英)洛夫"

]

},

"web": [

{

"value": [

"爱情",

"爱",

"爱"

],

"key": "Love"

},

{

"value": [

"无尽的爱",

"蓝色生死恋",

"不了情"

],

"key": "Endless Love"

},

{

"value": [

"早恋",

"青春期恋爱",

"初恋"

],

"key": "puppy love"

}

]

}

我们把数据定义为一个字符串,加入转义字符之后就成了这样,有点乱是吧,所以我们根据上图分析就好啦。

Json数据说白了就是对象和数组的相互嵌套,那么我们开始吧!

String st =

"{\"translation\":[\"爱\"],\"basic\":{\"us-phonetic\":\"lʌv\",\"phonetic\":\"lʌv\",\"uk-phonetic\":\"lʌv\",\"explains\":[\"n.

恋爱;亲爱的;酷爱;喜爱的事物\",\"vt. 喜欢;热爱;爱慕\",\"vi. 爱\",\"n.

(Love)人名;(英)洛夫\"]},\"query\":\"love\",\"errorCode\":0,\"web\":[{\"value\":[\"爱情\",\"爱\",\"爱\"],\"key\":\"Love\"},{\"value\":[\"无尽的爱\",\"蓝色生死恋\",\"不了情\"],\"key\":\"Endless

Love\"},{\"value\":[\"早恋\",\"青春期恋爱\",\"初恋\"],\"key\":\"puppy

love\"}]}";

JSONObject str = JSONObject.fromObject(st);                 //json数据的最外层肯定是一个对象,参数为字符串

//对象str又分为3部分:translation,basic,web

if(str.has("translation")){

JSONArray tr = str.getJSONArray("translation");               //translation是一个json数组

for(int i = 0 ;i

System.out.println(tr.getString(i));              //因为元素的值是String类型的所以忽的值的方法是getString(index)

}

}

//basic中有数组也有元素

if(str.has("basic")){

JSONObject us = str.getJSONObject("basic");               //对元素进行解析,并输出元素的值

System.out.print("美:[" + us.getString("us-phonetic") + "]\t");

JSONObject uk = str.getJSONObject("basic");

System.out.print("英:[" + us.getString("uk-phonetic") + "]\n");

JSONObject basic = str.getJSONObject("basic");              //先获得basic对象

JSONArray explain = basic.getJSONArray("explains");            //再获得basic对象下的explains数组

for(int i = 0;i

System.out.println(explain.getString(i));

}

}

if(str.has("web")){                               //web是一个数组,每个数组元素又是三个Json对象

System.out.println("拓展:");

JSONArray web = str.getJSONArray("web");

for(int i = 0; i

String t = web.getString(i);                   //遍历过程将web数组元素赋给String型变量

JSONObject we = JSONObject.fromObject(t);             //通过String又得到每个元素的对象

if(we.has("key")){

System.out.print(we.getString("key")+"\t");        //得到对象中的元素

}

if(we.has("value")){

JSONArray value = we.getJSONArray("value");

for(int x = 0 ; x

System.out.print(value.getString(x));       //得到数组元素的值

if(x

System.out.print(";");

}

}

}

System.out.println();

}

}

到这里就解析完啦!

Java XML JSON 数据解析

下面我们通过一段代码了解一下解析JSON格式数据的基本过程: 提示:使用JSON需要导入 JSON 相关的多个Jar文件 import net.sf.json.JSONObject; public c ...

cocos2d-x把json数据解析到数组或字典中(libjson库)

以前在cocos2d-x项目中用到json解析,集成了libjson库后发现网上提供的解析方法大多是在解析过程中取得值,并没有将解析结果有效的保存起来,于是摸索一番,把解析结果根据数据格式存到数组或字 ...

Java技巧——将前端的对象数组通过Json字符串传到后端并转换为对象集合

Java技巧——将前端的对象数组通过Json字符串传到后端并转换为对象集合 摘要:本文主要记录了如何将将前端的对象数组通过Json字符串传到后端,并在后端将Json字符串转换为对象集合. 前端代码 前 ...

JSON数据解析 基础知识及链接收集

JSON数据解析学习 JSON介绍 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式. JSON 是存储和交换文本信息的语法.类似 XML.但是JSON 比 ...

iOS - JSON 数据解析

iOS - JSON 数据解析 前言 NS_CLASS_AVAILABLE(10_7, 5_0) @interface NSJSONSerialization : NSObject @availab ...

Android学习笔记之JSON数据解析

转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ...

JSON数据解析及gson.jar包

从服务器端接收数据的时候,那些数据必须以浏览器能够理解的格式来发送. 服务器端的编程语言只能以如下 3 种格式返回数据: HTML XML JSON JSON一种简单的数据格式,比xml更轻巧. JS ...

使用Gson轻松解决复杂结构的Json数据解析

转载请注明来源: http://blog.csdn.net/kjunchen/article/details/50961803 JSON简介 JSON(JavaScript Object Notati ...

最简单简洁高效的Json数据解析

一.无图无真相 二.主要代码 1.导入jar包 拷贝fastjson.jar包到projectlibs包下 2.封装工具类JsonUtil.java package com.example.parse ...

随机推荐

IDEA:Maven项目找不到mapper文件 无法自动映射

如果你发现所有的功能都报找不到映射的错,有可能是因为mapper文件没有被编译 在eclipse中,把资源文件放在src下,是可以被编译的 但是在idea中,直接把资源文件放在src下,如果不进行设置 ...

C# 在PPT中绘制形状(shape)

概述 本篇文章将介绍C# 在PPT幻灯片中操作形状(shape)的方法.这里主要涉及常规形状,如箭头.矩形.圆形.三角形.多边形.不规则形状等.下面的示例中,可以通过绘制形状,并设置相应格式等.示例包 ...

[Solution] 893. Groups of Special-Equivalent Strings

Difficulty: Easy Problem You are given an array A of strings. Two strings S and T are special-equiva ...

MPU和CPU有什么区别?

MPU(或称MP,微处理器)和CPU(中央处理器)同为处理器,但范畴不同. 计算机(即电脑)分为巨型机,大型机,中型机,小型机和微型计算机5类.这5类计算机的运算核心统称为CPU,而MPU只是微型计算 ...

.net 缓存

缓存有很多实现方法,所有这些可以被分为两类,基于内存的缓存和基于磁盘的缓存: 1.  内存驻留缓存——包含在内存中临时存储数据的所有实现方法,通常在以下情况下使用: a)       应用程序频繁使用 ...

zabbix实现电话、短信、邮件报警

该报警方式提前说明:(1)该方式可以实现zabbix免费电话报警以及微信.短信.邮件报警,但有数量限制.详见如下:如数量不能满足需要以及人员需要,可以考虑购买收费版.(2)毕竟是免费版,电话通知要省着 ...

HDU 3047 Zjnu Stadium(带权并查集)

http://acm.hdu.edu.cn/showproblem.php?pid=3047 题意: 给出n个座位,有m次询问,每次a,b,d表示b要在a右边d个位置处,问有几个询问是错误的. 思路: ...

认识hasLayout——IE浏览器css bug的一大罪恶根源

### 解决 JSONArray.parseArray 处理多层嵌套 JSON 数组时的报错 当处理复杂的、带有多个层次结构的 JSON 数据时,`JSONArray.parseArray()` 方法可能无法直接解析这些数据。这通常是因为目标对象中的字段名称与 JSON 中的关键字不完全对应或者存在类型转换问题。 为了确保 `JSONArray.parseArray()` 正确工作,在定义 Java 类(如 `RequestDTO`)时应特别注意: - **注解的选择**:如果项目中同时引入了 Jackson 和 Fastjson 库,则需要注意区分 `@JsonProperty` 和 `@JSONField` 的使用场景[^3]。前者适用于 Jackson 序列化/反序列化操作;后者则用于 Fastjson。 - **类成员变量命名一致性**:保证 DTO 或 POJO 类的属性名字要跟 JSON 对象的一致,如果不一致可以借助上述提到过的两个注解来映射不同的键名。 对于具体的异常情况分析和解决方案如下: #### 1. 捕获并理解错误信息 首先查看抛出的具体 Exception 是什么类型的,并仔细阅读其 message 部分的内容。常见的有: - `JSONException`: 表明输入不是有效的 JSON 格式的字符串; - `ClassCastException`: 当尝试将一种类型强制转换为目标类型失败时发生此异常; - `InstantiationException`, `IllegalAccessException`: 这些通常是由于反射机制调用过程中出现问题引起的,比如私有的无参构造函数等。 #### 2. 调整实体类设计 针对复杂的数据模型,建议创建相应的内部静态类或单独文件表示每一级的对象关系。例如,如果有三层嵌套的关系 A -> B -> C ,那么就需要分别建立三个对应的 Bean 来接收相应级别的数据[^2]。 ```java public class Outer { private String outerProperty; @JSONField(name="inner_list") // 如果 key 名不同需指定 private List<Inner> innerList; public static class Inner{ private Long id; @JSONField(name="nested_items") private List<NestedItem> nestedItems; // getter setter... } // getter setter... } ``` #### 3. 设置合适的泛型参数 在调用 `parseArray` 函数时传入正确的 Class<?> 参数非常重要。如果是简单的单一层级列表可以直接传递基本类型或自定义 bean 的 `.class` 文件作为第二个参数给它。但对于更深层次的情况来说,应该先通过 `TypeReference<T>` 明确指出整个集合所包含元素的确切形式。 ```java // 假设有一个这样的 json [{"id":1,"items":[{"name":"item"}]}] String jsonString = "[{\"id\":1,\"items\":[{\"name\":\"item\"}]}]"; Type typeOfT = new TypeToken<List<Outer>>(){}.getType(); List<Outer> result = (List<Outer>) JSONObject.parseArray(jsonString, typeOfT); ``` 以上措施能够有效提高 `JSONArray.parseArray()` 在面对多层次嵌套 JSON 结构时的成功率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值