使用JSONObject和JSONArray输出带有数组的json数据

本文介绍了一种使用Java构造复杂JSON数据的方法,通过实例演示了如何创建包含数组和对象的JSON响应。文章详细解释了如何使用JSONObject和JSONArray来组织数据,并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      最近写接口需要通过json格式返回数据给前端。emmm,刚开始碰到了坑,因为对这两个方法不熟悉,昨天思考一下午没想出来,今天看了一下其他项目代码大概了解到怎么用了。。遇坑的原因是昨天倒错了JSONArray包,没注意到本来项目里有封装有一个JSONArray包。。。

项目要输出带有数组的数据,基本思路就是先创建一个JSONObject对象,再创建一个JSONArray对象,可以使用JSONArray的put方法在中添加多个JSONObject对象后,再用JSONObject的put方法把JSONArray添加进来。。具体实现代码如下:

        JSONObject returnJson = new JSONObject();

		JSONArray array = new JSONArray();
		JSONArray array2 = new JSONArray();

		JSONObject kq = new JSONObject();
		kq.put("kqdm", "库区代码");
	
		kq.put("kqmc", "库区名称");
		kq.put("kqdz", "库区地址");
		kq.put("ccsscq", "仓储设施产权");
	    kq.put("sjcr", "设计仓容");
	    kq.put("yxcr", "有效仓容");
	    kq.put("sjgr", "设计罐容");
	    kq.put("yxgr", "有效罐容");
	    kq.put("frsfzh", "法人身份证号");
	    kq.put("frxm", "法人姓名");
	    kq.put("frsjh", "法人手机号");
	    kq.put("lklxr", "粮库联系人");
	    kq.put("lklxrdh", "粮库联系人电话");
	    kq.put("bgdh", "办公电话");

         array.put(kq);

        JSONObject cf = new JSONObject();

        cf.put("kqdm", "库区代码");
	    cf.put("cfdm", "仓房代码");
	    cf.put("cfbh", "仓房编号");
	    cf.put("cfmc", "仓房名称");
	    cf.put("cx", "仓型");
	    cf.put("cwc", 1);
	    cf.put("cwk", 2);
	    cf.put("cwyg", 3);

        array2.put(cf);

		returnJson.put("dwmc", "单位名称");
		returnJson.put("qydm", "企业代码");
		returnJson.put("dwxz", "单位性质");
		returnJson.put("lsgx", "隶属关系");
		returnJson.put("zyyw", "主营业务");
		returnJson.put("jyfw", "经营范围");
		returnJson.put("dzxlysrs", "大专学历以上人数");

		returnJson.put("kqlb", array);
		returnJson.put("cflb", array2);

        return returnJson.toString();

输出结果:(结果数据不对应)

{
    "lskqs": "粮食库区数",
    "cfdm": "仓房代码",
    "qydm": "企业代码",
    "dwmc": "单位名称",
    "lsgx": "隶属关系",
    "kqs": "库区数",
    "jyfw": "经营范围",
    "zyyw": "主营业务",
    "ygs": "油罐数",
    "ygbh": "油罐编号",
    "yzkqs": "油脂库区数",
    "kqlb": [
      {
        "sffhwry": "是否符合污染源",
        "xzqydm": "行政区域代码",
        "frsfzh": "法人身份证号",
        "lklb": "粮库类别",
        "jcrq": "建成日期",
        "ywxfsy": "有无消防水源",
        "dzyx": "电子邮箱",
        "kqdm": "库区代码",
        "sjcr": "设计仓容",
        "ccsscq": "仓储设施产权",
        "yxcr": "有效仓容",
        "sjgr": "设计罐容",
        "frsjh": "法人手机号",
        "ywfhss": "有无防洪设施",
        "jd": 3,
        "ywtlzyx": "有无铁路专用线",
        "status": "状态"
      }
    ],
    "cfs": "仓房数",
    "zzyzgzsrs": "有职业资格证书人数",
    "yxgr": "有效罐容",
    "ajlb": [
      {
        "czsj": "Fri Sep 07 15:56:07 CST 2018",
        "yglx": "油罐类型",
        "ygjfssssfwh": "油罐及附属设施是否完好",
        "ygbh": "油罐编号",
        "zj": 3,
        "ywjrsz": "有无加热设置",
        "jzsj": "建造时间",
        "jdfs": "检定方式",
        "yxx": "有效性",
        "ygmc": "油罐名称",
        "kqdm": "库区代码",
        "gd": 3,
        "xgsj": "修改时间",
        "hjfs": "焊接方式",
        "status": "状态"
      }
    ]}

 

### 解决 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
发出的红包

打赏作者

younha66

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值