先描述下问题:
1、在写junit单元测试用例时,返回的json串转为java对象时不成功!出现错误提示
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.xx.xx.modules.bd.entity.xx.xx。
2、经过debug,发现对象属性全部都自动转为LinkedHashMap了,
content值为:{"statusCode":200,"msg":"成功返回","obj":[{"id":"41","isNewRecord":false,"remarks":"","createDate":"2016-08-28 09:03:52","updateDate":"2016-08-28 09:03:52","xxList":[],"xx":"","xx":"","xx":"","xx":"01","xx":"1","xx":45,"xxList":[]}]}
如图:
3、JsonResp 代码:
package com.xxx.xxx.common.json; import java.io.Serializable; /** * json 返回 * Created by weimingjia on 2016/7/10. */ public class JsonResp implements Serializable{ private int statusCode = 200; //状态码 private String msg; private Object obj; public JsonResp(){} public JsonResp(int statusCode,String msg){ this.statusCode = statusCode; this.msg = msg; } public JsonResp(int statusCode,String msg,Object obj){ this.statusCode = statusCode; this.msg = msg; this.obj = obj; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public Object getObj() { return obj; } public void setObj(Object obj) { this.obj = obj; } public int getStatusCode() { return statusCode; } public void setStatusCode(int statusCode) { this.statusCode = statusCode; } }
4、jsonMapper代码:
/** * Copyright © 2012-2014 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved. */ package com.xxx.xxx.common.mapper; import java.io.IOException; import java.util.List; import java.util.Map; import java.util.TimeZone; import org.apache.commons.lang3.StringEscapeUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonParser.Feature; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.util.JSONPObject; import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule; import com.google.common.collect.Lists; import com.google.common.collect.Maps; /** * 简单封装Jackson,实现JSON String<->Java Object的Mapper. * 封装不同的输出风格, 使用不同的builder函数创建实例. * @author ThinkGem * @version 2013-11-15 */ public class JsonMapper extends ObjectMapper { private static final long serialVersionUID = 1L; private static Logger logger = LoggerFactory.getLogger(JsonMapper.class); private static JsonMapper mapper; public JsonMapper() { this(Include.NON_NULL); } public JsonMapper(Include include) { // 设置输出时包含属性的风格 if (include != null) { this.setSerializationInclusion(include); } // 允许单引号、允许不带引号的字段名称 this.enableSimple(); // 设置输入时忽略在JSON字符串中存在但Java对象实际没有的属性 this.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); // 空值处理为空串 this.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>(){ @Override public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { jgen.writeString(""); } }); // 进行HTML解码。 /*this.registerModule(new SimpleModule().addSerializer(String.class, new JsonSerializer<String>(){ @Override public void serialize(String value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { jgen.writeString(StringEscapeUtils.unescapeHtml4(value)); } }));*/ // 设置时区 this.setTimeZone(TimeZone.getDefault());//getTimeZone("GMT+8:00") } /** * 创建只输出非Null且非Empty(如List.isEmpty)的属性到Json字符串的Mapper,建议在外部接口中使用. */ public static JsonMapper getInstance() { if (mapper == null){ mapper = new JsonMapper().enableSimple(); } return mapper; } /** * 创建只输出初始值被改变的属性到Json字符串的Mapper, 最节约的存储方式,建议在内部接口中使用。 */ public static JsonMapper nonDefaultMapper() { if (mapper == null){ mapper = new JsonMapper(Include.NON_DEFAULT); } return mapper; } /** * Object可以是POJO,也可以是Collection或数组。 * 如果对象为Null, 返回"null". * 如果集合为空集合, 返回"[]". */ public String toJson(Object object) { try { return this.writeValueAsString(object); } catch (IOException e) { logger.warn("write to json string error:" + object, e); return null; } } /** * 反序列化POJO或简单Collection如List<String>. * * 如果JSON字符串为Null或"null"字符串, 返回Null. * 如果JSON字符串为"[]", 返回空集合. * * 如需反序列化复杂Collection如List<MyBean>, 请使用fromJson(String,JavaType) * @see #fromJson(String, JavaType) */ public <T> T fromJson(String jsonString, Class<T> clazz) { if (StringUtils.isEmpty(jsonString)) { return null; } try { return this.readValue(jsonString, clazz); } catch (IOException e) { logger.warn("parse json string error:" + jsonString, e); return null; } } /** * 反序列化复杂Collection如List<Bean>, 先使用函數createCollectionType构造类型,然后调用本函数. * @see #createCollectionType(Class, Class...) */ @SuppressWarnings("unchecked") public <T> T fromJson(String jsonString, JavaType javaType) { if (StringUtils.isEmpty(jsonString)) { return null; } try { return (T) this.readValue(jsonString, javaType); } catch (IOException e) { logger.warn("parse json string error:" + jsonString, e); return null; } } /** * 構造泛型的Collection Type如: * ArrayList<MyBean>, 则调用constructCollectionType(ArrayList.class,MyBean.class) * HashMap<String,MyBean>, 则调用(HashMap.class,String.class, MyBean.class) */ public JavaType createCollectionType(Class<?> collectionClass, Class<?>... elementClasses) { return this.getTypeFactory().constructParametricType(collectionClass, elementClasses); } /** * 當JSON裡只含有Bean的部分屬性時,更新一個已存在Bean,只覆蓋該部分的屬性. */ @SuppressWarnings("unchecked") public <T> T update(String jsonString, T object) { try { return (T) this.readerForUpdating(object).readValue(jsonString); } catch (JsonProcessingException e) { logger.warn("update json string:" + jsonString + " to object:" + object + " error.", e); } catch (IOException e) { logger.warn("update json string:" + jsonString + " to object:" + object + " error.", e); } return null; } /** * 輸出JSONP格式數據. */ public String toJsonP(String functionName, Object object) { return toJson(new JSONPObject(functionName, object)); } /** * 設定是否使用Enum的toString函數來讀寫Enum, * 為False時時使用Enum的name()函數來讀寫Enum, 默認為False. * 注意本函數一定要在Mapper創建後, 所有的讀寫動作之前調用. */ public JsonMapper enableEnumUseToString() { this.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); this.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING); return this; } /** * 支持使用Jaxb的Annotation,使得POJO上的annotation不用与Jackson耦合。 * 默认会先查找jaxb的annotation,如果找不到再找jackson的。 */ public JsonMapper enableJaxbAnnotation() { JaxbAnnotationModule module = new JaxbAnnotationModule(); this.registerModule(module); return this; } /** * 允许单引号 * 允许不带引号的字段名称 */ public JsonMapper enableSimple() { this.configure(Feature.ALLOW_SINGLE_QUOTES, true); this.configure(Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); return this; } /** * 取出Mapper做进一步的设置或使用其他序列化API. */ public ObjectMapper getMapper() { return this; } /** * 对象转换为JSON字符串 * @param object * @return */ public static String toJsonString(Object object){ return JsonMapper.getInstance().toJson(object); } /** * JSON字符串转换为对象 * @param jsonString * @param clazz * @return */ public static Object fromJsonString(String jsonString, Class<?> clazz){ return JsonMapper.getInstance().fromJson(jsonString, clazz); } /** * 测试 */ public static void main(String[] args) { List<Map<String, Object>> list = Lists.newArrayList(); Map<String, Object> map = Maps.newHashMap(); map.put("id", 1); map.put("pId", -1); map.put("name", "根节点"); list.add(map); map = Maps.newHashMap(); map.put("id", 2); map.put("pId", 1); map.put("name", "你好"); map.put("open", true); list.add(map); String json = JsonMapper.getInstance().toJson(list); System.out.println(json); } }
5、单元测试用例代码:
package com.xxx.xxx.xx.xxx.xx.xx; import com.google.common.reflect.Reflection; import com.xxx.xxx.common.json.JsonResp; import com.xxxx.xxx.modules.bd.entity.prescription.PactsPrescription; import com.xxxx.xxx.modules.bd.entity.prescription.PactsTemplate; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.junit.Test; import org.springframework.test.util.ReflectionTestUtils; import org.springframework.test.web.servlet.MvcResult; import java.util.ArrayList; import java.util.List; import java.util.Map; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsEqual.equalTo; import static org.hamcrest.number.OrderingComparison.greaterThan; import static org.junit.Assert.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; /** * Created by weimingjia on 16-8-27. */ public class PactsPrescriptionRestControllerTest extends PactsTemplateRestControllerTest{ private String path = "/xxx/xx/xx/rest"; @Test public void testGetPactsPrescriptionByTemplateId() throws Exception { Object id = getAddResponseContent(); assertNotNull("xxx id is null",id); assertNotSame("xxx id is empty","",id); logger.info("xxx id is "+id); String pactsTemplateJsonAdd = String.format(pactsTemplateJson, id); PactsTemplate pactsTemplate = jsonMapper.fromJson(pactsTemplateJsonAdd,PactsTemplate.class); System.out.println(pactsTemplate); List<PactsPrescription> prescriptionListCorrect = pactsTemplate.getPrescriptionList(); assertNotNull("根据json文件读取xx模板 is null",prescriptionListCorrect); assertThat("根据json文件读取xx模板,xx集合 is empty",prescriptionListCorrect.size(),greaterThan(0)); PactsPrescription pactsPrescriptionCorrect = prescriptionListCorrect.get(0); MvcResult mvcResult= this.mockMvc.perform(get(path+"/byPactsTemplate/"+id.toString())) .andDo(print()) .andExpect(jsonPath("$.statusCode").value(200)) .andExpect(jsonPath("$.obj").value(is(instanceOf(List.class)))).andReturn(); String content = mvcResult.getResponse().getContentAsString(); System.out.println(content); // JSONObject jsonobject = JSONObject.fromObject(content); // JSONArray array = jsonobject.getJSONArray("obj"); // List<PactsPrescription> prescriptionList = new ArrayList<PactsPrescription>(); // for (int i = 0; i < array.size(); i++) { // JSONObject object = (JSONObject)array.get(i); // PactsPrescription passport = (PactsPrescription)JSONObject.toBean(object, // PactsPrescription.class); // if(passport != null){ // prescriptionList.add(passport); // } // } JsonResp jsonResp = jsonMapper.fromJson(content,JsonResp.class); System.out.println(jsonResp.getObj()); List<PactsPrescription> prescriptionList = (List<PactsPrescription>)jsonResp.getObj(); assertNotNull("根据xx模板id获取xx集合 is null",prescriptionList); assertThat("根据xx模板id获取xx集合 is empty",prescriptionList.size(),greaterThan(0)); PactsPrescription pactsPrescription = prescriptionList.get(0); assertThat("处方名称不一致",pactsPrescription.getPrescriptionName(),equalTo(pactsPrescriptionCorrect.getPrescriptionName())); assertThat("处方类型不一致",pactsPrescription.getPrescriptionType(),equalTo(pactsPrescriptionCorrect.getPrescriptionType())); } }
解决方式一:
1、引入jar包:
<!-- https://mvnrepository.com/artifact/com.hynnet/json-lib --> <dependency> <groupId>com.hynnet</groupId> <artifactId>json-lib</artifactId> <version>2.4</version> </dependency>
2、将以下代码注释打开:
// JSONObject jsonobject = JSONObject.fromObject(content); // JSONArray array = jsonobject.getJSONArray("obj"); // List<PactsPrescription> prescriptionList = new ArrayList<PactsPrescription>(); // for (int i = 0; i < array.size(); i++) { // JSONObject object = (JSONObject)array.get(i); // PactsPrescription passport = (PactsPrescription)JSONObject.toBean(object, // PactsPrescription.class); // if(passport != null){ // prescriptionList.add(passport); // } // }
同时,注释以下代码:
JsonResp jsonResp = jsonMapper.fromJson(content,JsonResp.class); System.out.println(jsonResp.getObj()); List<xxx> pxxList = (List<xxx>)jsonResp.getObj();
至此,完成!debug如图:
解决方式二:
ObjectMapper objectMapper = new ObjectMapper(); JsonNode rootNode = objectMapper.readTree(content); JsonNode objNode=rootNode.get("obj"); String json = objectMapper.writeValueAsString(objNode); JavaType javaType = objectMapper.getTypeFactory().constructParametricType( List.class, xxx.class); List<xxx> prescriptionList=objectMapper.readValue(json,javaType);
这种方式好处:不用重新引入新的json包,还是使用
import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper;
相关推荐
3. **将JSON转为Java对象** 使用`ObjectMapper`实例化Java对象。首先,我们需要创建一个`ObjectMapper`实例,然后调用其`readValue`方法,传入JSON字符串和目标类型(即我们之前定义的Java类): ```java ...
答:将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象] 从Java对象生成JSON的过程称为 [序列化Java对象到JSON] 为什么用它? 答:我数据库中的主键是使用雪花算法生成的,就是因为用id的位数太多,导致在...
Java作为一种常用的后端开发语言,需要处理这些JSON数据,将其转化为Java对象以便于操作。本主题主要关注如何使用`net.sf.json.JSONObject`这个库将多层集合嵌套的JSON数据转换为Java对象。 `...
本实例将详细介绍如何使用Jackson库进行JSON到Java对象的反序列化以及Java对象到JSON的序列化。 首先,我们需要引入Jackson库。在Maven项目中,可以在pom.xml文件中添加以下依赖: ```xml <groupId>...
是开源库Apache Commons的一个组件,提供了Java对象与JSON对象之间的转换功能。下面将详细阐述如何使用`JSONObject`进行JSON操作。 ### 1. 解析JSON字符串 当你从服务器获取或从文件读取到一个JSON字符串时,可以...
本资源提供了一个关于如何将复杂JSON转换为Java对象的学习实例,包括源码和可执行的jar包。 一、Jackson库的使用 Jackson是Java中广泛使用的JSON库,它的核心类`com.fasterxml.jackson.databind.ObjectMapper`负责...
这是本人写的一个基于JSON的完整项目,实现了Java对象、数组、集合转换为Json(Json转化为Java对象、数组、集合)。这是一个完整的项目,下载解压后直接导入MyEclipse/Eclipse中,运行com.demo.JSONDemo类即可看到效果...
可能包含的方法有`toJson()`(将Java对象转换为JSON字符串)、`fromJson()`(将JSON字符串解析为Java对象)、`convertToMap()`(将JSON字符串转换为Map)以及`convertToList()`(将JSON字符串转换为List)等。...
form数据与json对象的互相转换(完整版) * 将web Form 的数据转化成json字符串 * 将json对象的值解析后填入web Form 在AJAX开发中这是关键技术: 1、将form中的数据利用本工具转换成json格式的字符串,再通过ajax传...
标题中提到的“对象转为json格式所需要的所有的jar”,主要指的是Java中用于处理JSON转换的库的jar文件。其中,最常用的两个库是Jackson和Gson。 1. **Jackson库**: Jackson是Java中最流行的JSON处理库之一,由 ...
json 转换为 map 在 Java 中的实现 json(JavaScript Object Notation)是一种轻量级的数据交换格式,它广泛应用于 web 开发、移动应用开发和微服务架构中。Java 是一种流行的编程语言,广泛应用于企业级应用开发、...
IDEA作为一款强大的Java开发集成环境,提供了丰富的插件和功能,其中包括JSON到Java对象的转换。 要实现这个功能,首先你需要确保你的IDEA安装了相关的插件,例如“JsonToJava”或“GsonFormat”。如果尚未安装,...
以下我们将详细探讨Java中将对象转换为JSON字符串的三种方法,这里使用的是阿里巴巴的Fastjson库,它是一个高性能的JSON库,提供了丰富的API来处理JSON与Java对象之间的转换。 1. **将Java对象转成JSON串** 当我们...
1. **JSON对象结构**:JSON对象由键值对组成,键用引号括起来,值可以是字符串、数字、布尔值、数组、对象或null,键值对之间用逗号分隔,整个对象用花括号包围。例如: ```json { "name": "John", "age": 30, ...
在Java开发中,将Java Bean转换为JSON对象是一项常见的任务,特别是在处理前后端交互时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。Java Bean则...
在大多数编程语言中,都有内置或第三方库提供这样的功能,例如在Python中有`json`模块,Java中有`org.json`或`com.google.gson`库,JavaScript原生支持JSON对象。 在描述中提到的博客链接,虽然没有实际内容提供,...
JSONArray允许我们处理JSON数组,而JSONObject则允许我们操作JSON对象。 在上述实例中,当遇到需要读取数组中特定值的问题时,采用了org.json库中的JSONArray类。具体的做法是调用readJsonArray函数,并将JSON字符...
Fastjson的使用也非常直观,`JSON.toJSONString(obj)`可将Java对象转为JSON字符串,`JSON.parseObject(jsonStr, YourClass.class)`则完成反序列化。 这些库不仅支持基本类型和普通对象的转换,还支持集合、Map以及...
在JavaScript开发中,有时我们需要将JSON对象转换为JSON Schema,以便对数据进行验证。这在处理用户输入、API交互或者存储复杂数据结构时非常有用。`jsonToSchema`项目可能就是一个工具或库,用于帮助开发者实现这个...
8. **标签解析**: 关于“max”标签,可能是指在处理大量数据时,需要考虑JSON对象大小限制。Java和JavaScript都有最大内存限制,因此在转化大型集合时需注意避免内存溢出。可以通过分批处理或使用流式处理来优化。 ...