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_profiles
property 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 @JsonAnySetter
annotation. 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 稍后发送请求。