如何使用Jackson来反序列化对象数组

 

 

 

 

如何使用Jackson来反序列化对象数组

 

 

Jackson数据绑定文档表明Jackson支持反序列化“所有受支持类型的数组”,但是我无法确定确切的语法。

对于单个对象,我可以这样做:

//json input

{

"id" : "junk",

"stuff" : "things"

}


//Java

MyClass instance = objectMapper.readValue(json, MyClass.class);

现在,对于数组,我想这样做:

//json input

[{

"id" : "junk",

"stuff" : "things"

},

{

"id" : "spam",

"stuff" : "eggs"

}]


//Java

List<MyClass> entries = ?

有人知道是否有不可思议的命令吗? 如果没有,那么解决方案是什么?


#1楼 (guyue: 推荐, 既演示了反序列为 数组, 又演示了转换成 列表)

Eugene Tskhovrebov

List<MyClass> myObjects = Arrays.asList(mapper.readValue(json, MyClass[].class))

这个解决方案似乎对我来说是最好的

 


#2楼

try {

ObjectMapper mapper = new ObjectMapper();

JsonFactory f = new JsonFactory();

List<User> lstUser = null;

JsonParser jp = f.createJsonParser(new File("C:\\maven\\user.json"));

TypeReference<List<User>> tRef = new TypeReference<List<User>>() {};

lstUser = mapper.readValue(jp, tRef);

for (User user : lstUser) {

System.out.println(user.toString());

}


} catch (JsonGenerationException e) {

e.printStackTrace();

} catch (JsonMappingException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

 

 


 

 

#3楼

对于通用实现:

public static <T> List<T> parseJsonArray(String json,

Class<T> classOnWhichArrayIsDefined)

throws IOException, ClassNotFoundException {

ObjectMapper mapper = new ObjectMapper();

Class<T[]> arrayClass = (Class<T[]>) Class.forName("[L" + classOnWhichArrayIsDefined.getName() + ";");

T[] objects = mapper.readValue(json, arrayClass);

return Arrays.asList(objects);

}

 


#4楼

首先创建一个线程安全的ObjectReader实例。

ObjectMapper objectMapper = new ObjectMapper();

ObjectReader objectReader = objectMapper.reader().forType(new TypeReference<List<MyClass>>(){});

然后使用它:

List<MyClass> result = objectReader.readValue(inputStream);

#5楼

这是一个可以转换json2object或Object2json的实用程序,无论您的pojo(实体T)如何

 
import java.io.IOException;

import java.io.StringWriter;

import java.util.List;


import com.fasterxml.jackson.core.JsonGenerationException;

import com.fasterxml.jackson.core.JsonParseException;

import com.fasterxml.jackson.core.type.TypeReference;

import com.fasterxml.jackson.databind.DeserializationFeature;

import com.fasterxml.jackson.databind.JsonMappingException;

import com.fasterxml.jackson.databind.ObjectMapper;

import com.fasterxml.jackson.databind.SerializationFeature;


/**

*

* @author TIAGO.MEDICI

*

*/

public class JsonUtils {


public static boolean isJSONValid(String jsonInString) {

try {

final ObjectMapper mapper = new ObjectMapper();

mapper.readTree(jsonInString);

return true;

} catch (IOException e) {

return false;

}

}


public static String serializeAsJsonString(Object object) throws JsonGenerationException, JsonMappingException, IOException {

ObjectMapper objMapper = new ObjectMapper();

objMapper.enable(SerializationFeature.INDENT_OUTPUT);

objMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);

StringWriter sw = new StringWriter();

objMapper.writeValue(sw, object);

return sw.toString();

}


public static String serializeAsJsonString(Object object, boolean indent) throws JsonGenerationException, JsonMappingException, IOException {

ObjectMapper objMapper = new ObjectMapper();

if (indent == true) {

objMapper.enable(SerializationFeature.INDENT_OUTPUT);

objMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);

}


StringWriter stringWriter = new StringWriter();

objMapper.writeValue(stringWriter, object);

return stringWriter.toString();

}


public static <T> T jsonStringToObject(String content, Class<T> clazz) throws JsonParseException, JsonMappingException, IOException {

T obj = null;

ObjectMapper objMapper = new ObjectMapper();

obj = objMapper.readValue(content, clazz);

return obj;

}


@SuppressWarnings("rawtypes")

public static <T> T jsonStringToObjectArray(String content) throws JsonParseException, JsonMappingException, IOException {

T obj = null;

ObjectMapper mapper = new ObjectMapper();

obj = mapper.readValue(content, new TypeReference<List>() {

});

return obj;

}


public static <T> T jsonStringToObjectArray(String content, Class<T> clazz) throws JsonParseException, JsonMappingException, IOException {

T obj = null;

ObjectMapper mapper = new ObjectMapper();

mapper = new ObjectMapper().configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);

obj = mapper.readValue(content, mapper.getTypeFactory().constructCollectionType(List.class, clazz));

return obj;

}

 


#6楼

首先创建一个映射器:

import com.fasterxml.jackson.databind.ObjectMapper;// in play 2.3

ObjectMapper mapper = new ObjectMapper();

​​​​​​​

作为数组:

MyClass[] myObjects = mapper.readValue(json, MyClass[].class);

作为列表, 方法1:

List<MyClass> myObjects = mapper.readValue(jsonInput, new TypeReference<List<MyClass>>(){});

作为列表, 方法2:

List<MyClass> myObjects = mapper.readValue(jsonInput, mapper.getTypeFactory().constructCollectionType(List.class, MyClass.class));

 

 

 

 

如何使用Jackson来反序列化对象数组_asdfgh0077的博客-CSDN博客_jackson 反序列化 数组
https://blog.csdn.net/asdfgh0077/article/details/103888370

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值