jackson反序列化具有未知的动态属性
我有一个JSON字符串,如:
"shipping_profiles": { "563": { "name": "name", "value": "value" }, "564": { "name": "name", "value": "value" }, "565": { "name": "name", "value": "value" }, "566": { "name": "name", "value": "value" } }
现在我用Jackson 2.0解析它。 我想从JSON字符串中获取List
。
可能吗?
您的shipping_profiles
属性看起来不像数组。 它表示具有动态属性的对象,因此我们应该将其视为对象。 如果我们对属性@JsonAnySetter
我们可以使用@JsonAnySetter
注释。 算法可能如下所示:
- 将JSON反序列化为JSON模型类。
- 使用ObjectMapper将动态对象(贴图)转换为app的POJO类
- 随时使用应用程序的POJO。
请参阅我的示例实现。 我希望,它可以帮助您解决问题。 输入JSON:
{ "shipping_profiles":{ "563":{ "name":"name563", "value":"value563" }, "564":{ "name":"name564", "value":"value564" }, "565":{ "name":"name565", "value":"value565" }, "566":{ "name":"name566", "value":"value566" } } }
示例程序:
import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.ObjectMapper; public class JacksonProgram { 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
以上app打印:
[Profile [name=name563, value=value563], Profile [name=name564, value=value564], Profile [name=name565, value=value565], Profile [name=name566, value=value566]]
我用我的json动态属性解析了@michalziober提供的方式。
"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" }
有了这个json,我还需要保存那个动态属性,所以我添加了另一个List来存储它。
public class CommandClasses { private List nameList = new ArrayList (); private List commmandClasses = new ArrayList (); 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 getCommmandClasses() { return commmandClasses; } public void setCommmandClasses(List commmandClasses) { this.commmandClasses = commmandClasses; } }
现在我也可以访问该字段作为id以便稍后发送请求。