我正在嘗試將以下 JSON 決議為 POJO,特別是我想要提取為 String[] 或 List of String 而不會丟失 JSON 格式的有效負載。
{
"payLoad": [
{
"id": 1,
"userName": null,
"arName": "A1",
"areas": []
},
{
"id": 2,
"userName": "alpha2",
"arName": "A2",
"areas": []
}
],
"count": 2,
"respCode": 200
}
這是我正在使用的 POJO -
public class Response {
@JsonProperty("count")
private int totalCount;
@JsonProperty("respCode")
private int responseCode;
@JsonProperty("payLoad")
@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
private String[] transactionsList;
public String[] getTransactionsList() {
return transactionsList;
}
public void setTransactionsList(String[] transactionsList) {
this.transactionsList = transactionsList;
}
..
}
這是我使用 springboot 自動決議它的方法
public void transactionsReceived() throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
Response responseRcvd = objectMapper.readValue(jsonString, Response.class);
}
這是我得到的一個錯誤-
Exception in thread "main" com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `[Ljava.lang.String;` from Object value (token `JsonToken.START_OBJECT`)
at [Source: (String)"{"payLoad": [{"id": 1,"userName": null,"arName": "A1","areas": []},{"id": 2,"userName": "alpha2","arName": "A2","areas": []}],"count": 2,"respCode": 200}"; line: 1, column: 14] (through reference chain: com.example.demo.model.Response["payLoad"]->java.lang.Object[][0])
at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)
at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1741)..
uj5u.com熱心網友回復:
您可以撰寫自定義反序列化器:
public class JsonObjectListDeserializer extends StdDeserializer<List<String>> {
public JsonObjectListDeserializer() {
super(List.class);
}
@Override
public List<String> deserialize(JsonParser parser, DeserializationContext context) throws IOException, JacksonException {
JsonNode node = parser.getCodec().readTree(parser);
List<String> result = new ArrayList<>();
if (node.isArray()) {
for (JsonNode element : node) {
result.add(element.toString());
}
} else if (node.isObject()) {
result.add(node.toString());
} else {
//maybe nothing?
}
return result;
}
}
JsonNode.toString()回傳節點的 json 表示,像這樣您將節點恢復為 json 以保存在串列中。
然后僅為該特定欄位注冊反序列化器。
public static class Response {
@JsonProperty("count")
private int totalCount;
@JsonProperty("respCode")
private int responseCode;
@JsonProperty("payLoad")
@JsonDeserialize(using = JsonObjectListDeserializer.class)
private List<String> transactionsList;
//getters, setters, etc.
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/491864.html
