谁能告诉我如何迭代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));
JSONArray
[
{
"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 ( 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
到Pojo
类列表的简单示例:
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'}]