我正在使用Cumulocity Java SDK,并且试图访问其中一个ManagedObject中的自定义片段。像这样:
...
"type": "sap_CustomomerLocation",
"c8y_PropertyType":{
"Customer.Name":{
"name":"customerName",
"sap_field_name":{
"requestIdentifier":"SAP",
"adressIdentifier":"customerName"
}
},
"Customer.Address":{
"name":"customerAddress",
"sap_field_name":{
"requestIdentifier":"SAP",
"adressIdentifier":"customerAddress"
}
}
}
...
我无法更改片段的格式。在Java应用程序中,我通过以下方式获取Mo:
InventoryFilter filter = new InventoryFilter();
filter.byType("sap_CustomomerLocation");
ManagedObjectCollection configuration = platform.getInventoryApi().getManagedObjectsByFilter(filter);
ManagedObjectRepresentation singleConfig = configuration.get().allPages().iterator().next();
Map<String, Object> attrs = singleConfig.getAttrs();
问题是我无法到达“ sap_field_name”,attrs是HashMap @ Node。在IntelliJ的调试器中,当我使用“ evaluateExpression”时,会生成类似的内容:
((HashMap.Node)((HashMap)((HashMap.Node)((HashMap)((HashMap.Node)((HashMap)((HashMap.Node)((HashMap)attrs).entrySet().toArray()[0]).getValue()).entrySet().toArray()[0]).getValue()).entrySet().toArray()[0]).getValue()).entrySet().toArray()[1]).getValue()
那么,您能建议点什么吗?我应该以某种方式将其投放到DTO吗?但是接下来如何处理JSON中的键(“ Customer.Name”,“ Customer.Address”),因为这是一个字段列表,所以可能会更改。
答案 0 :(得分:1)
我试图在命名空间c8y.PropertyType
中创建一个新类,Cumulocity SDK或杰克逊JSON确实找到了一个类,并试图将其映射,但是问题仍然存在于此动态字段中
在对Jackson代码进行少量调试之后,我发现需要为所有自定义字段在正确的命名空间中创建一个类(不幸的是,我不知道名称)。
这是我发现可以接受的解决方法:
ManagedObjectRepresentation singleConfig;
Map<String, Object> attrs = singleConfig.getAttrs();
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = mapper.valueToTree(attrs);
String customFieldName = jsonNode.get("c8y_PropertyType").get("attrs").iterator().next().get("sap_field_name").get("adressIdentifier").asText();
答案 1 :(得分:0)
您可以采用的一种方法是为与内容匹配的c8y_PropertyType片段创建模型类。要映射此片段,您需要在包c8y中创建一个PropertyType类,并将其放在类路径中。
然后,JSON解析器将不再生成此HashMap结构,而是生成您的类。我不太确定JSON键中的点是否会引起问题。
如果您需要此类课程的示例,请检查https://bitbucket.org/m2m/cumulocity-clients-java/src/03e47693b1d389308901347d224c13d81250b703/device-capability-model/?at=develop