[英]Json Jackson won't unwrap root element
一段時間以來,我一直在嘗試反序列化 JSON 對象的數組,而 inte.net 上的所有答案要么已棄用,要么對我不起作用。
下面的代碼總是返回帶有以下消息的MismatchedInputException
:
...MismatchedInputException: Root name ('builders')
does not match expected ('Builder[]') for type `[LModel.Attributes.Builder;`
以下是我的 DTO 代碼:
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonRootName;
@JsonRootName("builders")
public class Builder {
private String id;
private String builder;
@JsonProperty("id")
public void setId(String id) {
this.id = id;
}
@JsonProperty("name")
public void setBuilder(String builder) {
this.builder = builder;
}
public String getBuilder() {
return builder;
}
public String getId(){
return id;
}
}
在這里我們有我們的反序列化器:
var json = response.body();
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
var builders = mapper.readValue(json, Builder[].class);
這是我的 JSON:
{
"builders": [
{
"id": 1,
"name": "Haley LLC"
},
{
"id": 2,
"name": "Stoltenberg, Mayert and Weimann"
},
{
"id": 3,
"name": "Ziemann Group"
},
{
"id": 4,
"name": "Monahan - Torp"
},
{
"id": 5,
"name": "Fritsch, Harber and Lemke"
}
]
}
如果只有一個 object 而不是 JSON 數組,注釋@JsonRootName
將按預期工作。 在這種情況下,我們需要一種不同的方法。
您可以使用方法ObjectMapper.readerFor( TypeReference )
指定List<Builder>
類型的TypeReference
來准備ObjectReader
。
為了打開這個 JSON 數組,我們可以使用ObjectReader.withRootName()
方法。
它可能是這樣的:
String json = """
{
"builders": [
{
"id": 1,
"name": "Haley LLC"
},
... // other elements
]
}
""";
ObjectMapper mapper = new ObjectMapper();
ObjectReader objectReader = mapper
.readerFor(new TypeReference<List<Builder>>() {})
.withRootName("builders");
List<Builder> builders = objectReader.readValue(json);
builders.forEach(System.out::println);
Output:
Builder{id='1', builder='Haley LLC'}
Builder{id='2', builder='Stoltenberg, Mayert and Weimann'}
Builder{id='3', builder='Ziemann Group'}
Builder{id='4', builder='Monahan - Torp'}
Builder{id='5', builder='Fritsch, Harber and Lemke'}
在這種情況下,不需要Builder
@JsonRootName
之上的 @JsonRootName。 你可以刪除它,如果你沒有其他案例,單個Builder
object 被包裝在 JSON 中。
此外,此解決方案不需要應用反序列化功能UNWRAP_ROOT_VALUE
。
你能試試包裝器 class:
public class Builder{
public int id;
public String name;
}
public class Root{
public ArrayList<Builder> builders;
}
ObjectMapper mapper = new ObjectMapper();
Root root = mapper.readValue(strJson, Root.class);
您可以反序列化為Map<String, List<Builder>>
,然后通過鍵“builders” get
。
即使在語義上它也不是一個糟糕的表示,因為畢竟它是一個 JS 字典 object,其中在鍵“builders”下有一個 Builders 列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.