这个问题,困惑我很久了。
总结:类的字段个数一定要大于json串的字段个数,否则反序列化失败。
Demo1:
Junit1:
@Test public void testJsonRead(){ //1.构造目标Json String targetJson_success = "{\"l\":1,\"m\":2}"; // String targetJson_failed = "{\"l\":1,\"m\":2,\"r\":3,\"g\":4}"; // String targetJson_normal = "{\"l\":1,\"m\":2,\"r\":3}"; //2.构造目标 Java Bean MyTriple mt=JsonMapper.getDefault().readValue(targetJson_success, MyTriple.class); System.out.println(mt); }
类MyTrilple:
/** * Copyright (c) 2009-2015. 上海诺诺镑客 All rights reserved. * @(#) MyTriple.java 2015年4月23日 下午2:55:24 */ package com.nonobank.common.domain; /** * @FileName: MyTriple.java * @Function:TODO * @date: 2015年4月23日 下午2:55:24 * @author: wandejun * @since JDK 1.8 */ public class MyTriple { Short l; Integer m; Long r; public Short getL() { return l; } public void setL(Short l) { this.l = l; } public Integer getM() { return m; } public void setM(Integer m) { this.m = m; } public Long getR() { return r; } public void setR(Long r) { this.r = r; } @Override public String toString() { return "MyTriple [l=" + l + ", m=" + m + ", r=" + r + "]"; } }
观察Junit1的那个代码,正如注释所说的一样,targetJson_success、targetJson_normal的json串全部可以反序列化成功,但是targetJson_failed就是失败的。
原因就是我上面所说的,targetJson_success是2个参数,分别是l,m,而MyTriple类中是3个参数l,m,r
那么3>=2,所以targetJson_success是可以的。
而targetJson_failed是4个参数,分别是l,m,r,r而MyTriple类中是3个参数l,m,r
那么3<=4,所以targetJson_failed是不可以的。
---------------------------------------------------------------------------------------------------
Demo2:
转化类:
/** * * @Title: getStudentInfoBySessionId * @Description:根据sessionId从memchache中获取用户信息 * @param sessionId * @return * @Return: Map<String,String> * */ public MicroPHPResult getStudentInfoBySessionId(String sessionId) { MultiValueMap<String, String> form = new LinkedMultiValueMap<String, String>(); form.add("sessionId", sessionId); String microPhpUrl = DefaultWebAppConfigure.getConfigure().getMicroPhpUrl(); String phpResp = restTemplate.postForObject(microPhpUrl + "user/getSessionData", form, String.class); if (phpResp == null) { LOG.error("根据sessionId获取用户信息超时."); return null; } MicroPHPResult result = readJsonValue(phpResp, MicroPHPResult.class); return result; }
类MicroPHPResult:
package com.nonobank.web.web.controller.credit.bean; public class MicroPHPResult { private String flag; private String msg; private UserInfoData data; public String getFlag() { return flag; } public void setFlag(String flag) { this.flag = flag; } public UserInfoData getData() { return data; } public void setData(UserInfoData data) { this.data = data; } @Override public String toString() { return "MicroPHPResult [flag=" + flag + ", data=" + data + ", getFlag()=" + getFlag() + ", getData()=" + getData() + ", getClass()=" + getClass() + ", hashCode()=" + hashCode() + ", toString()=" + super.toString() + "]"; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }
注意到:phpResp这个字符串是接口返回的,它必须包含2个参数,一个是flg,一个是msg.
在成功的情况下会追加参数:data
在失败的情况下则没有data参数.
因此,只要类中有flg和msg就不会出错。
相关推荐
`jackson-annotations-2.2.3.jar` 提供了诸如`@JsonProperty`、`@JsonIgnore`、`@JsonInclude`等注解,可以方便地控制哪些字段应该被序列化或反序列化,以及如何处理特定的数据类型。 要使用Jackson库进行JSON序列...
例如,如果我们有一个`Person`类,我们可能希望在序列化时不包含某些字段,或者在反序列化时忽略某些输入。通过使用`@JsonIgnore`注解,我们可以排除特定属性。另外,可以使用`@JsonCreator`注解来指定一个构造函数...
此外,FastJson还支持JSON到Java的映射配置,可以自定义字段的序列化和反序列化规则。 2. Gson: Gson是Google提供的一个开源项目,用于在Java对象和JSON数据之间进行映射。Gson可以将任何Java对象转换成对应的...
在编程领域,序列化和反序列化是两个关键的概念,特别是在跨平台通信、持久化存储以及数据传输中扮演着重要角色。本篇文章将深入探讨C#和Java中的序列化与反序列化机制。 首先,我们要了解什么是序列化。序列化是指...
在"TestJson"这个例子中,可能包含了一个或多个测试用例,用于检验JSON反序列化的正确性。这可能是一个简单的JSON字符串,或者是一个包含复杂嵌套结构的JSON对象。开发者通常会编写测试代码,模拟从服务器获取JSON...
在讨论Json反序列化过程中,我们通常会采用ObjectMapper类这一常用的工具。ObjectMapper是Jackson库中的一个核心类,它提供了丰富的API来处理JSON数据。在服务器端开发中,我们常常需要处理来自第三方接口的JSON数据...
4. **使用版本控制的序列化策略**:例如,使用JSON库(如Jackson或Gson)进行序列化,这些库通常能更好地处理类结构的变化,同时支持版本控制,允许在反序列化时兼容旧版本的数据格式。 5. **持久化存储的替代方案*...
总结,Java中的JSON序列化与反序列化是数据交互的重要环节,Jackson和Gson是两个常用的库,它们提供了丰富的功能和良好的API设计,使得处理JSON数据变得简单高效。通过理解和掌握这些知识,开发者可以更好地在Java...
5. **序列化框架**:除了标准的Java序列化机制,还有许多高级的序列化库,如Jackson、Gson、protobuf等,它们提供了更灵活的配置和更好的性能。 在实际项目中,理解并熟练掌握序列化和反序列化对于开发高效、安全的...
在Java编程语言中,对象的序列化和反序列化是两个关键的概念,它们允许我们将对象的状态转换为可存储或传输的格式,然后再恢复为原始对象。这个过程对于数据持久化、网络传输以及跨进程通信等场景非常有用。下面将...
在反序列化过程中,JVM会根据字节流中的信息创建一个新的对象实例,并填充相应的字段值。然而,反序列化时需要注意安全问题,因为它可能会执行对象构造函数和字段初始化代码,因此如果数据来源不可信,可能会引入...
Jackson 库提供了多态序列化的功能,能够将基类和子类正确地序列化和反序列化。多态序列化指的是在序列化和反序列化过程中,能够正确地识别和处理基类和子类之间的关系。 在本文中,我们将通过一个示例来展示 ...
5. **安全**:序列化漏洞可能导致安全问题,例如反序列化攻击。 因此,选择合适的序列化工具至关重要。对于Java对象,推荐使用高效的JSON序列化库,如Jackson或Gson,它们支持配置以优化性能和数据大小。同时,确保...
虽然简单易用,但效率较低,且序列化的元数据(如类名、字段名)会被包含在字节流中,存在安全风险(如反序列化攻击)。 2. **FST(Fast-serialization)**: FST是一个高性能的序列化库,它通过优化的二进制格式...
- **手动指定**:为了确保反序列化时的兼容性,开发者可以手动在类中声明一个`static final long serialVersionUID`字段,值通常为`private static final long serialVersionUID = 1L;`。 - **变化的影响**:如果...
这样,所有日期时间类型的字段在序列化到JSON时,都会按照这个格式显示,同时在反序列化时也会按照此格式解析。 2. **自定义日期转换器**: 对于GET请求中的查询参数,Spring提供了一种机制通过实现`Converter`...
在JSON序列化与反序列化的场景中,我们经常使用如Jackson这样的库来处理Java对象与JSON字符串之间的转换。Jackson库提供了强大的功能,包括通过注解来控制哪些字段应该被序列化或忽略。然而,有时我们需要更灵活的...
然而,有时候我们不希望序列化对象的所有属性,可能是因为某些属性包含敏感信息,或者它们在反序列化时不需要。针对这种情况,Java提供了机制来排除特定属性进行序列化。本文将深入探讨如何在Java中实现这一功能。 ...
Jackson 序列化是基于 Java 反射机制的,通过对对象的字段进行序列化生成 JSON 字符串。然而,在序列化 Apache Avro 对象时,可能会遇到一些问题,例如序列化 Apache Avro 对象的 Schema 属性时抛出异常。 问题的...