json概念
json (javascript object notation) 是一种轻量级的数据交换格式。它易于人阅读和编写,同时也易于机器解析和生成。json 基于 javascript(ecmascript(欧洲计算机协会制定的js规范)) 编程语言的一个子集,但它是一种独立于语言的数据格式,被广泛应用于各种编程语言和平台之间的数据交换。
json 的主要特点:
轻量级: json 格式非常简洁,只包含必要的数据信息,减少了传输的数据量,提高了数据传输效率。
易于阅读和编写: json 的结构清晰,使用键值对的方式组织数据,易于人理解和编写。
易于解析和生成: 各种编程语言都提供了 json 解析器和生成器,方便程序处理 json 数据。
跨平台、跨语言: json 是一种与编程语言无关的数据格式,可以在不同的平台和编程语言之间进行数据交换。
数据结构: json 支持两种基本的数据结构:
- 对象(object): 由花括号
{}
包围,包含一系列键值对。键必须是字符串,值可以是基本数据类型(字符串、数字、布尔值、null)、数组或另一个 json 对象。 - 数组(array): 由方括号
[]
包围,包含一系列值。值可以是基本数据类型(字符串、数字、布尔值、null)、json 对象或另一个数组。
json 的数据类型:
- 字符串(string): 用双引号
""
包围的 unicode 字符序列。 - 数字(number): 可以是整数或浮点数。
- 布尔值(boolean):
true
或false
。 - 空值(null):
null
。 - 对象(object): 键值对的集合。
- 数组(array): 值的有序列表。
语法:
- 数据在 键值对(key/value) 中
- 数据由逗号 , 分隔
- 对象⽤
{}
表⽰ - 数组⽤
[]
表⽰ - 值可以为对象, 也可以为数组, 数组中可以包含多个对象
json 示例:
{ "name": "张三", "age": 30, "city": "北京", "isstudent": false, "courses": ["语文", "数学", "英语"], "address": { "street": "xx大街", "zipcode": "100000" } }
如何与java对象进行转化
objectmapper
是 jackson 库中的一个核心类,主要用于在 java 对象(pojo,plain old java object)和 json 数据之间进行转换。 简单来说,它能帮你把 json 字符串变成 java 对象,也能把 java 对象变成 json 字符串。
objectmapper 的主要功能
- 序列化 (serialization): 将 java 对象转换为 json 字符串。 这个过程也称为 “marshalling”。
- 反序列化 (deserialization): 将 json 字符串转换为 java 对象。 这个过程也称为 “unmarshalling”。
为什么需要 objectmapper
- 简化 json 处理: 手动解析 json 字符串或手动构建 json 字符串非常繁琐且容易出错。
objectmapper
封装了这些复杂的操作,让你只需要调用几个简单的方法就能完成转换。 - 类型安全:
objectmapper
在转换过程中会进行类型检查,确保数据的正确性。 例如,如果你尝试将一个包含字符串的 json 字段反序列化为 java 的int
类型,objectmapper
会抛出异常。 - 配置灵活:
objectmapper
提供了丰富的配置选项,可以自定义 json 转换的行为,例如日期格式、字段命名策略、忽略未知字段等。
objectmapper 的常用方法
writevalueasstring(object value)
: 将 java 对象转换为 json 字符串。
objectmapper mapper = new objectmapper(); myobject obj = new myobject("张三", 30); string jsonstring = mapper.writevalueasstring(obj); system.out.println(jsonstring); // 输出: {"name":"张三","age":30}
readvalue(string content, class<t> valuetype)
: 将 json 字符串转换为 java 对象。
objectmapper mapper = new objectmapper(); string jsonstring = "{\"name\":\"李四\",\"age\":25}"; myobject obj = mapper.readvalue(jsonstring, myobject.class); system.out.println(obj.getname()); // 输出: 李四 system.out.println(obj.getage()); // 输出: 25
易错点:
readvalue(string content, typereference<t> valuetyperef)
: 将 json 字符串转换为复杂的泛型类型(如 list 或 map<k, v>)。
当你需要将一个 json 数组转换为 java 的 list 集合时,你需要使用 typereference 来帮助 jackson 保留泛型信息。
objectmapper mapper = new objectmapper(); string jsonarraystring = "[{\"name\":\"张三\",\"age\":30}, {\"name\":\"李四\",\"age\":25}]"; // 错误的做法:mapper.readvalue(jsonarraystring, list.class); // 这会导致 list 中的元素被解析为 linkedhashmap,而不是 myobject // 正确的做法:使用 typereference list<myobject> userlist = mapper.readvalue(jsonarraystring, new typereference<list<myobject>>() {}); system.out.println(userlist.get(0).getname()); // 输出: 张三
readtree(string content)
: 将 json 字符串转换为 jsonnode
对象。 jsonnode
是 jackson 库中表示 json 树结构的类,可以方便地访问 json 数据的各个部分。
objectmapper mapper = new objectmapper(); string jsonstring = "{\"name\":\"王五\",\"age\":40}"; jsonnode rootnode = mapper.readtree(jsonstring); string name = rootnode.get("name").astext(); int age = rootnode.get("age").asint(); system.out.println(name); // 输出: 王五 system.out.println(age); // 输出: 40
使用 objectmapper 的步骤
添加 jackson 依赖: 在你的项目中添加 jackson 库的依赖。 如果你使用 maven,可以在 pom.xml
文件中添加以下依赖:(如果是springboot
项目那么其已经内置了,不需要再导入)
<dependency> <groupid>com.fasterxml.jackson.core</groupid> <artifactid>jackson-databind</artifactid> <version>2.16.1</version> <!-- 使用最新版本 --> </dependency>
创建 objectmapper 对象
普通项目:
objectmapper mapper = new objectmapper();
springboot
项目
正如前文所说,spring boot 已经为我们自动配置了一个 objectmapper bean。因此,在 spring boot 项目中,我们不应该手动 new objectmapper(),而应该通过依赖注入(di)来使用这个已经配置好的单例对象。
@service public class myservice { private final objectmapper objectmapper; // 通过构造函数注入(推荐) @autowired public myservice(objectmapper objectmapper) { this.objectmapper = objectmapper; } public void dosomething() { // 直接使用注入的 objectmapper 实例 // ... } }
调用 objectmapper 的方法进行 json 转换: 使用 writevalueasstring()
进行序列化,使用 readvalue()
或 readtree()
进行反序列化。
objectmapper 的高级用法
自定义序列化器和反序列化器: 可以自定义 jsonserializer
和 jsondeserializer
来控制 json 转换的细节。
使用注解: 可以使用 jackson 提供的注解 (例如 @jsonproperty
, @jsonignore
, @jsonformat
) 来配置 json 转换的行为。
@jsonproperty("user_name")
: 用于指定 java 属性在 json 中对应的键名,常用于连接不同的命名风格(如 java 的驼峰 username 和 json 的下划线 user_name)。@jsonignore
: 在序列化和反序列化时完全忽略某个属性。@jsonformat(pattern = "yyyy-mm-dd hh:mm:ss")
: 用于指定 date 或 localdatetime 等日期类型的格式。
配置 objectmapper: 可以通过 objectmapper
的配置方法 (例如 configure()
, setpropertynamingstrategy()
) 来调整 json 转换的各种参数。
到此这篇关于java对象与json互相转化的示例详解的文章就介绍到这了,更多相关java对象转json内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论