java 具有未知动态属性的 Jackson 反序列化
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/17685508/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Hymanson deserialization with unknown dynamic properties
提问by Tanmay Mandal
I have a JSON string like:
我有一个 JSON 字符串,如:
"shipping_profiles": {
"563": {
"name": "name",
"value": "value"
},
"564": {
"name": "name",
"value": "value"
},
"565": {
"name": "name",
"value": "value"
},
"566": {
"name": "name",
"value": "value"
}
}
Now I am parsing it with Hymanson 2.0.
I am trying to get a List<shipping_profiles>from the JSON string.
现在我用Hymanson 2.0解析它。我正在尝试List<shipping_profiles>从 JSON 字符串中获取 a 。
Is it possible?
是否可以?
回答by Micha? Ziober
Your shipping_profilesproperty doesn't look like array. It represent object with dynamic properties, so we should treat it like an object. If we do not know anything about properties we can use @JsonAnySetterannotation. Algorithm could looks like below:
您的shipping_profiles财产看起来不像数组。它代表具有动态属性的对象,所以我们应该把它当作一个对象来对待。如果我们对属性一无所知,我们可以使用@JsonAnySetter注释。算法可能如下所示:
- Deserialize JSON into JSON-model classes.
- Convert dynamic objects (maps) into app's POJO classes using ObjectMapper
- Use app's POJO whenever you want.
- 将 JSON 反序列化为 JSON 模型类。
- 使用 ObjectMapper 将动态对象(地图)转换为应用程序的 POJO 类
- 随时使用应用程序的 POJO。
Please see my example implementation. I hope, it help you solve your problem. Input JSON:
请参阅我的示例实现。我希望,它可以帮助您解决您的问题。输入 JSON:
{
"shipping_profiles":{
"563":{
"name":"name563",
"value":"value563"
},
"564":{
"name":"name564",
"value":"value564"
},
"565":{
"name":"name565",
"value":"value565"
},
"566":{
"name":"name566",
"value":"value566"
}
}
}
Example program:
示例程序:
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.fasterxml.Hymanson.annotation.JsonAnySetter;
import com.fasterxml.Hymanson.annotation.JsonProperty;
import com.fasterxml.Hymanson.databind.ObjectMapper;
public class HymansonProgram {
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
File source = new File("X:/test.json");
Entity entity = mapper.readValue(source, Entity.class);
ShippingProfiles shippingProfiles = entity.getShippingProfiles();
List<Map<String, String>> profileMaps = shippingProfiles.getProfiles();
List<Profile> profiles = new ArrayList<Profile>(profileMaps.size());
for (Map<String, String> item : profileMaps) {
profiles.add(mapper.convertValue(item, Profile.class));
}
System.out.println(profiles);
}
}
class Entity {
@JsonProperty("shipping_profiles")
private ShippingProfiles shippingProfiles;
public ShippingProfiles getShippingProfiles() {
return shippingProfiles;
}
public void setShippingProfiles(ShippingProfiles shippingProfiles) {
this.shippingProfiles = shippingProfiles;
}
}
class ShippingProfiles {
private List<Map<String, String>> profiles = new ArrayList<Map<String, String>>();
@JsonAnySetter
public void setDynamicProperty(String name, Map<String, String> map) {
profiles.add(map);
}
public List<Map<String, String>> getProfiles() {
return profiles;
}
public void setProfiles(List<Map<String, String>> profiles) {
this.profiles = profiles;
}
}
class Profile {
private String name;
private String value;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
@Override
public String toString() {
return "Profile [name=" + name + ", value=" + value + "]";
}
}
Above app prints:
上面的应用程序打印:
[Profile [name=name563, value=value563], Profile [name=name564, value=value564], Profile [name=name565, value=value565], Profile [name=name566, value=value566]]
回答by Robert
I got my json with dynamic property parsed with the way @michalziober provide.
我使用@michalziober 提供的方式解析了带有动态属性的 json。
"commandClasses": {
"32": {
"name": "Basic",
"data": {
"name": "devices.1.instances.1.commandClasses.32.data",
"value": null,
"type": "NoneType"
},
"38": {
"name": "SwitchMultilevel",
"data": {
"name": "devices.1.instances.1.commandClasses.38.data",
"value": null,
"type": "NoneType"
},
"43": {
"name": "SceneActivation",
"data": {
"name": "devices.1.instances.1.commandClasses.43.data",
"value": null,
"type": "NoneType"
}
With this json I also need to save that dynamic property, so I add another List for storing it.
有了这个 json,我还需要保存那个动态属性,所以我添加了另一个 List 来存储它。
public class CommandClasses {
private List<String> nameList = new ArrayList<String>();
private List<CommandClass> commmandClasses = new ArrayList<CommandClass>();
private Logger logger = Logger.getInstance(CommandClasses.class);
@JsonAnySetter
public void setDynamicCommandClass(String name, CommandClass cc) {
logger.d("@ adding new CC : " + name);
nameList.add(name);
commmandClasses.add(cc);
}
public List<CommandClass> getCommmandClasses() {
return commmandClasses;
}
public void setCommmandClasses(List<CommandClass> commmandClasses) {
this.commmandClasses = commmandClasses;
}
}
Now I can also access the field as id to send out request later.
现在我还可以访问该字段作为 id 稍后发送请求。

