(ObjectMapper)Json转化对象的基本原理

1. 前言

  1. 在实际开发过程中,会经常接收Json字符串并转化为相应对象,而这个转化过程中若报错,无非提示,没有set方法,或者没有get方法,或者静态内部类没有默认构造函数静态内部类没有带全部参数构造函数无法转化多了某某field属性等等
  2. 因此,在大多数开发的过程中,我们自然会在实体类对象上,一股脑加上 @Data,@NoArgsConstructor,@AllArgsConstructor,@JsonIgnoreProperties(ignoreUnknown = true),甚至让实体类变量与json内部key字段起名完全一样,这确实可以解决百分之九十的问题。
  3. 剩下百分之十的问题如下(例子):
    在这里插入图片描述
    见鬼了,属性名字完全一致,该有的东西都有了,为什么还是转化失败呢?这待我慢慢细说一下。

2. 先说结论

  1. 在ObjectMapper json转化对象过程中,可以单独使用set方法,或field属性(强调是public 属性),或get方法,进行变量属性赋值。
  2. 若都存在,优先级是:set方法 > field属性(强调是public 属性) > get方法
  3. 容易遗忘点:在使用set方法,get方法的时候,请让实体类的属性名 第二个字符不要大写,不要大写,不要大写,因为在使用上述方法的时候,例如属性名xAge,对应的标准set方法,则是setXAge(),而在使用set方法转化的时候,会先找到setXAge()方法,并把set去掉,将后面遇到大写字符变成小写,直到遇到小写字符才会停止,此时得到的是 xage,显然与 属性名xAge 不一样,因此无法正确转化赋值。

3. 证明结论

先准备如下例子:
在这里插入图片描述
开始跟踪源码(请忽略一些细节)
代码会收集可以被转化的属性,如下:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在_addGetterMethod()或者_addSetterMethod()方法中,都会去获取方法名,并截掉对应的get/set方法前缀,获取到对应的属性名
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

收集器 收集好可以被转化的属性之后,就要生成对应的赋值的工具对象
这样子解释吧,比如转化这里肯定是使用反射的方式,对于set方法,使用 invoke方法,而field属性,使用filed.set()方法。
在这里插入图片描述
这里则是对收集到的属性生成对应的赋值方法(姑且可以这样子认为), 从代码上看,可以看出有顺序之分,set方法,field,get,构造。
之后开始赋值了:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最后结果:
在这里插入图片描述

4. 使用@JsonAutoDetect定义字段、方法的访问可见性规则

  1. 上面证明结论的时候,属性字段设置public可以赋值成功,但实体类并不想直接让属性字段暴露出来,可是又想赋值,此时我们可以使用@JsonAutoDetect,改变属性的可见性,这里的修改可见性仅仅是让json转化的时候,认为是可见而已,相当于一个标记,实际上外部调用该类属性,还是没办法类.字段属性

    public enum Visibility {
            ANY, 					// 所有的访问修饰符
            NON_PRIVATE, 			// 除 private 之外的
            PROTECTED_AND_PUBLIC, 	// 允许 protected、public
            PUBLIC_ONLY, 			// 只允许 public
            NONE, 					// 禁用 AutoDetect
            DEFAULT;
        }
    

    证明:
    在这里插入图片描述

  2. 实际上,上面的set方法/get方法赋值也是建立在public,若set方法,或者get方法不是public也无法赋值,证明:
    在这里插入图片描述
    通过@JsonAutoDetect 修改方法可见性
    在这里插入图片描述

  3. 源码上 在addField()以及addMethod()方法的时候,也有判断 可见性,以field为例子:
    在这里插入图片描述

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: ObjectMapper是一个Java库,用于将JSON字符串换为Java对象或将Java对象换为JSON字符串。它提供了一组API,可以轻松地将JSON数据映射到Java对象中,并且可以处理各种复杂的JSON结构。使用ObjectMapper,您可以轻松地将JSON数据换为Java对象,以便在应用程序中进行处理和操作。 ### 回答2: ObjectMapper是一个Java类库,它可以将JSON数据换为Java对象或者将Java对象换为JSON数据。在Java中使用ObjectMapper进行JSON数据换时,需要引入jackson-databind依赖包,因为ObjectMapper是jackson-databind的一部分。 在Java中,我们使用ObjectMapper进行JSON对象的步骤如下: 1. 创建ObjectMapper对象 首先,我们需要创建一个ObjectMapper对象,这可以使用如下代码实现: ObjectMapper objectMapper = new ObjectMapper(); 2. 将JSON字符串换为Java对象 要将JSON字符串换为Java对象,我们需要使用ObjectMapper的readValue()方法,该方法接收两个参数:JSON字符串和要换的Java对象类型。 例如,如果我们有一个JSON字符串: {"name": "张三", "age": 18} 我们可以使用以下方法将其换为Java对象: String json = "{\"name\": \"张三\", \"age\": 18}"; Person person = objectMapper.readValue(json, Person.class); 其中,Person类是一个Java对象类型,它要求与JSON字符串格式相匹配。 3. 将Java对象换为JSON字符串 将Java对象换为JSON字符串也很简单,只需要使用ObjectMapper的writeValueAsString()方法,该方法接收一个Java对象参数,并返回与该对象相应的JSON字符串。 例如,如果我们有一个Person对象: Person person = new Person("李四", 20); 我们可以使用以下方法将其换为JSON字符串: String json = objectMapper.writeValueAsString(person); 最后,需要注意的是,在使用ObjectMapper进行JSON换时,有些复杂的Java对象可能需要自定义反序列化器或序列化器。因此,在实际应用中,需要根据具体情况做出相应的调整。 ### 回答3: ObjectMapperJava中的一个类库,主要用于实现Java对象Json相互转化的功能,特别是JsonJava对象转化。通过使用ObjectMapper,我们可以非常方便地将Json字符串Java对象或将Java对象Json字符串。 ObjectMapper的主要作用是提供基本的Json换功能,包括将字符串Json格式,将Json格式对象,以及对象Json格式等。此外,ObjectMapper还提供了一些高级的用法,如序列化和反序列化Json类型,自定义类型换和过滤器等。 ObjectMapperJava中最常用的JSON工具,它支持将Java对象转化JSON格式的字符串,也能将JSON字符串转化Java对象。通过ObjectMapper,我们可以快速地进行JSON字符串和Java对象之间的换,非常方便地进行数据传输。 使用ObjectMapper来进行json换,我们需要先实例化ObjectMapper对象,然后使用它提供的方法来进行Json对象Java对象之间的换。 在将Java对象换为Json字符串时,我们可以通过ObjectMapper的writeValueAsString()方法来实现。将Java对象Json字符串时,我们需要注意类和属性的注解和类型,以确保换的正确性和完整性。 在将Json换为Java对象时,我们可以通过ObjectMapper的readValue()方法来实现。在进行Json字符串和Java对象之间的换时,我们需要保证类和属性的注解和类型与换之前相同,以保证换的一致性和正确性。 总之,使用ObjectMapper进行Json换非常方便且简单,让我们能够轻松将Java对象Json对象之间互相转化。对于开发者来说,在实际项目中使用ObjectMapper能够提高效率,减少错误,加快开发速度,增加可读性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值