サード パーティのサービス プロバイダーから JSON 応答を受け取りましたが、その応答にはオブジェクトの配列が含まれています。Jackson APIを使用してJSONを逆シリアル化しようとしているとき。次の例外が発生しています
com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of JacksonFields out of START_ARRAY token
at [Source: java.io.BufferedReader@1015a9e; line: 5, column: 26]
私のJSON応答は
{
"flags" : 1074200577,
"results" : {
"id1" : 0,
"id2" : 0,
"fields" : [
{
"id1" : 19202,
"id2" : 19202,
"count" : 0,
"format" : 8,
"type" : "name",
"flags" : 0,
"group" : 1074,
"value" : "1074"
},
{
"id1" : 19218,
"id2" : 19218,
"count" : 0,
"format" : 8,
"type" : "name",
"flags" : 0,
"group" : 1075,
"value" : "1075"
}
]
}
}
そして、私のPOJOクラスは次のようになります
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
class JacksonFields {
int id1;
int id2;
int count;
int format;
String type;
int flags;
int group;
String value;
public JacksonFields(){
}
@JsonCreator
public JacksonFields(@JsonProperty("id1") int id1,
@JsonProperty("id2") int id2,
@JsonProperty("count") int count,
@JsonProperty("format") int format,
@JsonProperty("type") String type,
@JsonProperty("flags") int flags,
@JsonProperty("group") int group,
@JsonProperty("value") String value){
this.id1 = id1;
this.id2 = id2;
this.count = count;
this.format = format;
this.type = type;
this.flags = flags;
this.group = group;
this.value = value;
}
public void putId1(int id){
this.id1=id;
}
public void putId2(int id){
this.id2=id;
}
public void putCount(int count){
this.count=count;
}
public void putFormat(int format){
this.format=format;
}
public void putType(String type){
this.type=type;
}
public void putFlag(int flag){
this.flags=flag;
}
public void putGroup(int group){
this.group=group;
}
public void putValue(String val){
this.value=val;
}
}
class JacksonResults {
int id1;
int id2;
JacksonFields fields;
@JsonCreator
public JacksonResults(@JsonProperty("id1") int id1,
@JsonProperty("id2") int id2,
@JsonProperty("fields") JacksonFields fields){
this.id1 = id1;
this.id2 = id2;
this.fields = fields;
}
public JacksonResults(){
}
public void putId1(@JsonProperty("id1") int id){
this.id1 = id;
}
public void putId2(@JsonProperty("id2") int id){
this.id2 = id;
}
public void putFields(@JsonProperty("fields") JacksonFields fie){
this.fields = fie;
}
}
public class JacksonJsonObj{
Long flags;
JacksonResults res;
@JsonCreator
public JacksonJsonObj(@JsonProperty("flags") long flags,
@JsonProperty("results") JacksonResults res){
this.flags = flags;
this.res = res;
}
public JacksonJsonObj(){
}
public void putFlags(@JsonProperty("flags") long flag){
this.flags = flag;
}
public void putResults(@JsonProperty("results") JacksonResults res){
this.res=res;
}
}
次のコードを使用してJSONを逆シリアル化しようとしています
ObjectMapper objmapper = new ObjectMapper();
objmapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
JacksonJsonObj jackobj = objmapper.readValue(new BufferedReader(new inputStreamReader(ipStream)), JacksonJsonObj.class);
やろうとしたら
JacksonJsonObj[] jackobj = objmapper.readValue(new BufferedReader(new inputStreamReader(ipStream)), JacksonJsonObj[].class);
BEGIN_OBJECT 自体で失敗します。
配列を使用して JSON を読み取り、逆シリアル化する方法。独自のデシリアライザーを作成する必要がありますか?
EDIT ストリームではなくJSON文字列で作業すると、すべてのJavaオブジェクトを取り戻すことができます。しかし、パフォーマンスを向上させるために、ジャクソンにはストリームで作業してもらいたい
別の方法
List<JsonFields> JsonFieldsJackson = new ArrayList<JsonFields>();
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
JsonNode nodes = mapper.readTree(strbuffer.toString());
nodes.elements();
Iterator<JsonNode> iter = nodes.path("results").path("fields").elements();
while(iter.hasNext()){
JsonNode node = iter.next();
JsonFields fie = mapper.readValue(node.toString(),JsonFields.class);
JsonFieldsJackson.add(fie);
}