[英]How to covert JSON field name to a Java compatible property name while doing Jackson de-serialisation?
[英]How to convert JSON field name to Java bean class property with Jackson
我可以訪問返回 JSON 字符串的 RESTful API,例如:
{
"Container1": {
"active": true
},
"Container2": {
"active": false
},
}
問題是 RESTful API 設計有點錯誤。 字段名稱已包含數據。 使用 Jackson 庫,無法將字段名稱反序列化為相應 Java bean class 的屬性名稱。 我認為,這也不是 JSON 規范的意圖。 上面的 JSON 字符串需要反序列化為以下 class 的實例:
public class Container {
private Boolean active;
private String name;
}
我最終得到UnrecognizedPropertyException
字段Container1
。
我想配置為忽略未知屬性並為該屬性提供JsonDeserializer
,如下所示:
@JsonIgnoreProperties(ignoreUnknown = true)
public class Container {
private Boolean active;
private String name;
@JsonDeserialize(using = FieldNameToPropertyDeserializer.class)
public void setName(String name) {
this.name = name;
}
}
和FieldNameToPropertyDeserializer
:
public class FieldNameToPropertyDeserializer extends StdDeserializer<String> {
public FieldNameToPropertyDeserializer() {
super(String.class);
}
@Override
public String deserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException {
return parser.getCurrentName();
}
}
反序列化的調用實現如下:
String jsonString = response.readEntity(String.class);
ObjectMapper objectMapper = new ObjectMapper();
ObjectReader readerFor = objectMapper.readerFor(Container.class);
MappingIterator<Container> mappingIterator = readerFor.readValues(jsonString);
while (mappingIterator.hasNext()) {
Container container = (Container) mappingIterator.next();
containers.add(container);
}
但我只收到空對象(屬性設置為null
),因為我設置@JsonIgnoreProperties(ignoreUnknown = true)
,因此跳過了對屬性的解析。
這可能嗎? 或者我應該在之后實施類似后處理的東西嗎?
這個怎么樣。 像這樣創建一個 class ContainerActive
public class ContainerActive {
private boolean active;
// constructors, setters, getters
}
你可以這樣做
Map<String, ContainerActive> map = mapper.readValue(jsonString, new TypeReference<Map<String, ContainerActive>>() {});
有了這個,您將擁有“Container1”、“Container2”作為鍵和 ContainerActive Object 作為具有活動字段的值。
Just a quick solution, if the object is such that, that all of it object is a container object you can receive the JSON inside and JSONObject you may use below code
import java.io.IOException;
import org.json.JSONException;
import org.json.JSONObject;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class TestSO {
public static void main(String[] args) throws JsonParseException, JsonMappingException, JSONException, IOException {
String jsonString = "{\r\n" +
" \"Container1\": {\r\n" +
" \"active\": true\r\n" +
" },\r\n" +
" \"Container2\": {\r\n" +
" \"active\": false\r\n" +
" },\r\n" +
"}";
JSONObject jsonObject = new JSONObject(jsonString);
ObjectMapper mapper = new ObjectMapper();
for (String key : jsonObject.keySet()) {
Container container = mapper.readValue(jsonObject.get(key).toString(), Container.class);
System.out.println(container);
}
}
static class Container{
private String name;
private Boolean active;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Boolean getActive() {
return active;
}
public void setActive(Boolean active) {
this.active = active;
}
@Override
public String toString() {
return "Container [name=" + name + ", active=" + active + "]";
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.