arrays - 如何遍历在 Java 8 中具有 JSONArray 和 JSONObject 的 JSONArray
问题描述
谁能告诉我如何遍历JSONArray
其中的返回值JSONArray
和返回值JSONObject
。我尝试了下面的代码,但出现如下错误。
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of 'com.example.jsonarr.pojoClass[]' out of START_OBJECT token
代码
List<pojoClass> pojoClassList = new ArrayList();
JSONArray jsonArrayList = new JSONArray( jsonResponse );
ObjectMapper objectMapper = new ObjectMapper( );
pojoClassList = (List)objectMapper.readValue(jsonArrayList.toString(),
objectMapper.getTypeFactory().constructCollectionType(List.class, pojoClass[].class));
JSON数组
[
{
"Key1": "Value1",
"Key2": "Value2",
"Key3": "Value3",
"Value1_tim": {
"amVal": 0,
"pmVal": "0"
}
},
[ {
"Key1": "Value1",
"Key2": "Value2",
"Key3": "Value3",
"Value1_tim": {
"amVal": 0,
"pmVal": "0"
}
}]
]
使用正常的 for 循环。
for ( int i = 0; i < jsonArrayList.length(); i++ ) {
JSONObject jsonObject = jsonArrayList.optJSONObject( i );
if ( jsonObject != null ) {
pojoClass = objectMapper.readValue( jsonObject.toString(), PojoClass.class );
}
if ( jsonObject == null ) {
JSONArray jsonArrayInner = new JSONArray( jsonArrayList.getJSONArray( i ).toString() );
for ( int j = 0; j < jsonArrayInner.length(); j++ ) {
JSONObject jsonObject1 = jsonArrayList.optJSONObject( j );
if ( jsonObject1 != null ) {
pojoClass = objectMapper.readValue( jsonObject1.toString(), PojoClass.class );
}
}
}
pojoClassList.add( pojoClass );
}
我该怎么做Java 8
?
解决方案
如果您使用Jackson
'ObjectMapper
尝试使用ACCEPT_SINGLE_VALUE_AS_ARRAY
允许将单个元素视为one-element-array
. 下面,您可以找到简单的示例,如何阅读您的JSON
toPojo
类列表:
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.type.CollectionType;
import java.io.File;
import java.util.List;
import java.util.stream.Collectors;
public class JsonApp {
public static void main(String[] args) throws Exception {
File jsonFile = new File("./resource/test.json").getAbsoluteFile();
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
CollectionType collectionType0 = mapper.getTypeFactory().constructCollectionType(List.class, Pojo.class);
CollectionType collectionType1 = mapper.getTypeFactory().constructCollectionType(List.class, collectionType0);
List<List<Pojo>> list = mapper.readValue(jsonFile, collectionType1);
List<Pojo> pojos = list.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
System.out.println(pojos);
}
}
class Pojo {
@JsonProperty("Key1")
private String key1;
// getters, setters, toString
}
上面的代码打印:
[Pojo{key1='Value1'}, Pojo{key1='Value1-1'}]
推荐阅读
- java - Lambdas Java 8 中的类型擦除泛型编译
- delphi - Delphi 中 DLL/Exe 中的字符串处理
- webassembly - Blazor 中有没有办法将 map wasm-function(#) 反转回 c# 方法?
- ruby-on-rails - 如何从 Rails 引擎在开发组中添加 gem?
- javascript - 将“元素”对象传递给类
- html - 导航栏项目扩展超过 1 行它更改为 ... 作为下拉
- firebase - 从firestore js sdk缓存中检索文档的firebase是否收费
- r - 为什么 LDA 预测不正确
- image - 阻止来自浏览器的直接 url 访问,但允许来自 ios 和 android
- javascript - Javascript切片函数为相同的值返回不同的值?