java后台对json格式数据的解析

简介: Json 和 Jsonlib 的使用什么是 JsonJSON(JvaScript Object Notation)(官网网站:http://www.json.org/)是 一种轻量级的数据交换格式。

Json 和 Jsonlib 的使用

  • 什么是 Json

JSON(JvaScript Object Notation)(官网网站:http://www.json.org/)是 一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。它基于 JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999 的一个子集。 JSON 采用完全独立于语言的文本格式,但是也使用了类似于 C 语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使 JSON 成为理想的数据交换语言。

  • JSON 的两种结构

1.“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表 (hash table),有键列表(keyed list),或者关联数组 (associative array)。 在 Java 语言中,我们可以将它理解成 HashMap。

对象是一个无序的"'名称/值'对"集合。一个对象以"{"(左括号)开始,"}"(右括号)结束。每个“名称”后跟一个":"(冒号);"'名称/值' 对"之间使用","(逗号)分隔。

示例:var json = {"name":"Jack","age":90,"Marray":true};

2. 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(Array 或 List)。

数组是值(value)的有序集合。一个数组以"["(左中括号)开始,"]"(右中括号)结束。值之间使用","(逗号)分隔。

示例:var json = ["Jack","Rose","Tom",89,true,false];

  • Json-lib

Json-lib 是一个 Java 类库(官网:http://json-lib.sourceforge.net/)可以实现如下功能:

  • 转换 javabeans, maps, collections, java arrays 和 XML 成为 json 格式数据
  • 转换 json 格式数据成为 javabeans 对象

Json-lib 需要的 jar 包

  • commons-beanutils-1.8.3.jar
  • commons-collections-3.2.1.jar
  • commons-lang-2.6.jar
  • commons-logging-1.1.1.jar
  • ezmorph-1.0.6.jar
  • json-lib-2.4-jdk15.jar

 

  • Json-lib 的使用

1. 将 Array 解析成 Json 串。使用 JSONArray 可以解析 Array 类型:

复制代码
package cn.sunzn.json;

import java.util.ArrayList;
import java.util.HashSet; import java.util.List; import java.util.Set; import net.sf.json.JSONArray; public class JsonLib { public static void main(String[] args) { /** * 将 Array 解析成 Json 串 */ String[] str = { "Jack", "Tom", "90", "true" }; JSONArray json = JSONArray.fromObject(str); System.err.println(json); /** * 对像数组,注意数字和布而值 */ Object[] o = { "北京", "上海", 89, true, 90.87 }; json = JSONArray.fromObject(o); System.err.println(json); /** * 使用集合类 */ List<String> list = new ArrayList<String>(); list.add("Jack"); list.add("Rose"); json = JSONArray.fromObject(list); System.err.println(json); /** * 使用 set 集 */ Set<Object> set = new HashSet<Object>(); set.add("Hello"); set.add(true); set.add(99); json = JSONArray.fromObject(set); System.err.println(json); } }
复制代码

运行结果如下:

["Jack","Tom","90","true"]
["北京","上海",89,true,90.87]
["Jack","Rose"]
[99,true,"Hello"]

2. 将 JavaBean/Map 解析成 JSON 串。 使用JSONObject 解析:

复制代码
package cn.sunzn.json;

import java.util.HashMap;
import java.util.Map; import net.sf.json.JSONObject; public class JsonLib { @SuppressWarnings("static-access") public static void main(String[] args) { /** * 解析 HashMap */ Map<String, Object> map = new HashMap<String, Object>(); map.put("name", "Tom"); map.put("age", 33); JSONObject jsonObject = JSONObject.fromObject(map); System.out.println(jsonObject); /** * 解析 JavaBean */ Person person = new Person("A001", "Jack"); jsonObject = jsonObject.fromObject(person); System.out.println(jsonObject); /** * 解析嵌套的对象 */ map.put("person", person); jsonObject = jsonObject.fromObject(map); System.out.println(jsonObject); } }
复制代码

运行结果如下:

{"age":33,"name":"Tom"}
{"id":"A001","name":"Jack"}
{"person":{"id":"A001","name":"Jack"},"age":33,"name":"Tom"}

3. 使用 JsonConfig 过虑属性:适用于 JavaBean/Map

复制代码
package cn.sunzn.json;

import net.sf.json.JSONObject;
import net.sf.json.JsonConfig; public class JsonLib { public static void main(String[] args) { JsonConfig config = new JsonConfig(); config.setExcludes(new String[] { "name" }); // 指定在转换时不包含哪些属性 Person person = new Person("A001", "Jack"); JSONObject jsonObject = JSONObject.fromObject(person, config); // 在转换时传入之前的配置对象  System.out.println(jsonObject); } }
复制代码

运行结果如下,在运行结果中我们可以看到 name 属性被过滤掉了:

{"id":"A001"}

4. 将 Json 串转换成 Array:

复制代码
package cn.sunzn.json;

import java.util.Arrays;
import net.sf.json.JSONArray; public class JsonLib { public static void main(String[] args) { JSONArray jsonArray = JSONArray.fromObject("[89,90,99]"); Object array = JSONArray.toArray(jsonArray); System.out.println(array); System.out.println(Arrays.asList((Object[]) array)); } }
复制代码

运行结果如下:

[Ljava.lang.Object;@1e5003f6
[89, 90, 99]

5. 将 Json 串转成 JavaBean/Map:

复制代码
package cn.sunzn.json;

import java.util.Map;

import net.sf.json.JSONObject; public class JsonLib { @SuppressWarnings("unchecked") public static void main(String[] args) { /** * 将 Json 形式的字符串转换为 Map */ String str = "{\"name\":\"Tom\",\"age\":90}"; JSONObject jsonObject = JSONObject.fromObject(str); Map<String, Object> map = (Map<String, Object>) JSONObject.toBean(jsonObject, Map.class); System.out.println(map); /** * 将 Json 形式的字符串转换为 JavaBean */ str = "{\"id\":\"A001\",\"name\":\"Jack\"}"; jsonObject = JSONObject.fromObject(str); System.out.println(jsonObject); Person person = (Person) JSONObject.toBean(jsonObject, Person.class); System.out.println(person); } }
复制代码

运行结果如下:

{age=90, name=Tom}
Person [id=A001, name=Jack]

在将 Json 形式的字符串转换为 JavaBean 的时候需要注意 JavaBean 中必须有无参构造函数,否则会报如下找不到初始化方法的错误:

复制代码
Exception in thread "main" net.sf.json.JSONException: java.lang.NoSuchMethodException: cn.sunzn.json.Person.<init>()
   at net.sf.json.JSONObject.toBean(JSONObject.java:288)
   at net.sf.json.JSONObject.toBean(JSONObject.java:233)
   at cn.sunzn.json.JsonLib.main(JsonLib.java:23)
Caused by: java.lang.NoSuchMethodException: cn.sunzn.json.Person.<init>()
   at java.lang.Class.getConstructor0(Unknown Source)
   at java.lang.Class.getDeclaredConstructor(Unknown Source)
   at net.sf.json.util.NewBeanInstanceStrategy$DefaultNewBeanInstanceStrategy.newInstance(NewBeanInstanceStrategy.java:55) at net.sf.json.JSONObject.toBean(JSONObject.java:282) ... 2 more
复制代码
目录
相关文章
|
4月前
|
Java API 开发工具
【Azure Developer】Java代码实现获取Azure 资源的指标数据却报错 "invalid time interval input"
在使用 Java 调用虚拟机 API 获取指标数据时,因本地时区设置非 UTC,导致时间格式解析错误。解决方法是在代码中手动指定时区为 UTC,使用 `ZoneOffset.ofHours(0)` 并结合 `withOffsetSameInstant` 方法进行时区转换,从而避免因时区差异引发的时间格式问题。
269 3
|
5月前
|
数据采集 JSON Java
Java爬虫获取1688店铺所有商品接口数据实战指南
本文介绍如何使用Java爬虫技术高效获取1688店铺商品信息,涵盖环境搭建、API调用、签名生成及数据抓取全流程,并附完整代码示例,助力市场分析与选品决策。
|
5月前
|
数据采集 存储 前端开发
Java爬虫性能优化:多线程抓取JSP动态数据实践
Java爬虫性能优化:多线程抓取JSP动态数据实践
|
4月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
358 16
|
7月前
|
JSON 前端开发 应用服务中间件
配置Nginx根据IP地址进行流量限制以及返回JSON格式数据的方案
最后,记得在任何生产环境部署之前,进行透彻测试以确保一切运转如预期。遵循这些战术,守卫你的网络城堡不再是难题。
307 3
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
409 2
|
10月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1017 29
|
10月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
437 4
|
10月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
10月前
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。

推荐镜像

更多
  • DNS