Apama 如何解析HTTP JSON响应负载中的值
我对阿帕玛比较陌生。我使用的是v10.3.1。我将按照以下代码片段在监视器中执行REST请求: 当前处理响应的操作如下所示:Apama 如何解析HTTP JSON响应负载中的值,apama,Apama,我对阿帕玛比较陌生。我使用的是v10.3.1。我将按照以下代码片段在监视器中执行REST请求: 当前处理响应的操作如下所示: action handleResponse(Response response){ if response.isSuccess(){ print "###The response payload is :" + response.payload.toString(); } else {
action handleResponse(Response response){
if response.isSuccess(){
print "###The response payload is :" + response.payload.toString();
}
else {
print "###Request failed. Response status is: " + response.statusCode.toString() + " | " + response.statusMessage;
}
}
我正在寻找在JSON响应负载中提取以下属性值的最佳方法:
assetparents.references[0].managedObject.name (here “SOME”).
###The response payload is :com.apama.util.AnyExtractor(any(string,"
{"owner":"some@one.com","additionParents":{
"self":"https://somebaseurl/inventory/managedObjects/5706999/additionParents","references":[]
},
"childDevices":{
"self":"https://somebaseurl/inventory/managedObjects/5706999/childDevices","references":[]
},
"childAssets":{
"self":"https://somebaseurl/inventory/managedObjects/5706999/childAssets","references":[]
},
"creationTime":"2019-05-09T11:36:10.197Z",
"lastUpdated":"2019-05-10T05:28:07.893Z",
"childAdditions":{
"self":"https://somebaseurl/inventory/managedObjects/5706999/childAdditions",
"references":[{
"managedObject":{"name":"Escalate alarmtest",
"self":"https://somebaseurl/inventory/managedObjects/5706698",
"id":"5706698"},
"self":"https://somebaseurl/inventory/managedObjects/5706999/childAdditions/5706698"
}
]},
"name":"SOME Test Device",
"deviceParents":{
"self":"https://somebaseurl/inventory/managedObjects/5706999/deviceParents",
"references":[]
},
"assetParents":{
"self":"https://somebaseurl/inventory/managedObjects/5706999/assetParents",
"references":[{
"managedObject":{
"additionParents":{
"self":"https://somebaseurl/inventory/managedObjects/5706682/additionParents",
"references":[]
},
"childDevices":{
"self":"https://somebaseurl/inventory/managedObjects/5706682/childDevices",
"references":[]
},
"childAssets":{
"self":"https://somebaseurl/inventory/managedObjects/5706682/childAssets",
"references":[]
},
"childAdditions":{
"self":"https://somebaseurl/inventory/managedObjects/5706682/childAdditions",
"references":[]
},
"name":"SOME",
"deviceParents":{
"self":"https://somebaseurl/inventory/managedObjects/5706682/deviceParents",
"references":[]
},
"assetParents":{
"self":"https://somebaseurl/inventory/managedObjects/5706682/assetParents",
"references":[]
},
"self":"https://somebaseurl/inventory/managedObjects/5706682",
"id":"5706682"
},
"self":"https://somebaseurl/inventory/managedObjects/5706999/assetParents/5706682"
}]
},
"self":"https://somebaseurl/inventory/managedObjects/5706999",
"id":"5706999",
"c8y_ActiveAlarmsStatus":{
"minor":0,
"critical":1
},
"c8y_IsDevice":{},
"ax_Customer":"SOME CUSTOMER",
"c8y_SupportedMeasurements":["c8y_Temperature"]}"))
我尝试了不同的方法,但总是出错
print语句为响应负载提供以下输出:
assetparents.references[0].managedObject.name (here “SOME”).
###The response payload is :com.apama.util.AnyExtractor(any(string,"
{"owner":"some@one.com","additionParents":{
"self":"https://somebaseurl/inventory/managedObjects/5706999/additionParents","references":[]
},
"childDevices":{
"self":"https://somebaseurl/inventory/managedObjects/5706999/childDevices","references":[]
},
"childAssets":{
"self":"https://somebaseurl/inventory/managedObjects/5706999/childAssets","references":[]
},
"creationTime":"2019-05-09T11:36:10.197Z",
"lastUpdated":"2019-05-10T05:28:07.893Z",
"childAdditions":{
"self":"https://somebaseurl/inventory/managedObjects/5706999/childAdditions",
"references":[{
"managedObject":{"name":"Escalate alarmtest",
"self":"https://somebaseurl/inventory/managedObjects/5706698",
"id":"5706698"},
"self":"https://somebaseurl/inventory/managedObjects/5706999/childAdditions/5706698"
}
]},
"name":"SOME Test Device",
"deviceParents":{
"self":"https://somebaseurl/inventory/managedObjects/5706999/deviceParents",
"references":[]
},
"assetParents":{
"self":"https://somebaseurl/inventory/managedObjects/5706999/assetParents",
"references":[{
"managedObject":{
"additionParents":{
"self":"https://somebaseurl/inventory/managedObjects/5706682/additionParents",
"references":[]
},
"childDevices":{
"self":"https://somebaseurl/inventory/managedObjects/5706682/childDevices",
"references":[]
},
"childAssets":{
"self":"https://somebaseurl/inventory/managedObjects/5706682/childAssets",
"references":[]
},
"childAdditions":{
"self":"https://somebaseurl/inventory/managedObjects/5706682/childAdditions",
"references":[]
},
"name":"SOME",
"deviceParents":{
"self":"https://somebaseurl/inventory/managedObjects/5706682/deviceParents",
"references":[]
},
"assetParents":{
"self":"https://somebaseurl/inventory/managedObjects/5706682/assetParents",
"references":[]
},
"self":"https://somebaseurl/inventory/managedObjects/5706682",
"id":"5706682"
},
"self":"https://somebaseurl/inventory/managedObjects/5706999/assetParents/5706682"
}]
},
"self":"https://somebaseurl/inventory/managedObjects/5706999",
"id":"5706999",
"c8y_ActiveAlarmsStatus":{
"minor":0,
"critical":1
},
"c8y_IsDevice":{},
"ax_Customer":"SOME CUSTOMER",
"c8y_SupportedMeasurements":["c8y_Temperature"]}"))
除了解析单个属性外,推荐的将整个对象映射到Apama事件的方法是什么
如果您能提供一个代码片段,我们将不胜感激
非常感谢
Mathias来回答你的第一个问题 print语句的输出非常有用。它表明响应负载是原始JSON字符串,而不是解析的JSON对象。这意味着JOSN编解码器跳过了对JSON srting的解码。如果
contentType
头不完全是application/JSON
,则在使用“JSON with generic request/response event definitions”插件时会发生这种情况。使用Cumulocity进行的测试表明,头的值并不总是application/json
,而是像application/vnd.com.nsn.Cumulocity.managedobject+json
或application/vnd.com.nsn.Cumulocity.measurementcollection+json
这样的值,而当前的json编解码器无法处理
有两种方法可以在不更改JSON编解码器的情况下处理它
1) 禁用JSON编解码器对消息的过滤
“具有通用请求/响应事件定义的JSON”插件使用的JSON编解码器配置为跳过未将contentType
头设置为application/JSON
的消息解码。这可以通过编辑Designer项目中“连接和适配器/HTTP客户端/HTTPClient”节点下的HTTPClient.yaml
文件来禁用。将filterOnContentType
属性设置为false
。这将导致所有响应作为JSON处理;如果负载不是JSON,解析将失败,消息将被丢弃。因此,只有在确定所有响应都是JSON时才启用此选项
2) 在EPL中解析JSON字符串
另一种选择是在EPL本身中将字符串解析为JSON,然后将JSON对象包装到AnyExtractor
中以提取所需的值。您可以使用下面的方法来实现这一点
using com.apama.json.JSONPlugin;
using com.apama.util.AnyExtractor;
...
action handleResponse(Response res) {
if res.isSuccess() {
log "Response is: " + res.toString();
// Check if payload is string. A string payload could suggest raw JSON string
switch (res.payload.data as payload) {
case string: {
// Parse the JSON string manually
AnyExtractor extractor := AnyExtractor(JSONPlugin.fromJSON(payload));
string name := extractor.getString("assetparents.references[0].managedObject.name");
}
default: {
// probably already parsed to JSON - use AnyExtractor to work on it
}
}
} else {
log "Failed: " + res.statusMessage at ERROR;
}
}
要解决第二个问题,即“将整个对象映射到Apama事件的建议方法是什么?”: 我已经定义了几个事件,它们将映射到您提供的JSON:
event Reference {
string self;
any managedObject;
}
event Object {
string self;
sequence<Reference> references;
}
event ActiveAlarmsStatus {
integer minor;
integer critical;
}
event IsDevice {}
event ManagedObject {
string owner;
string self;
string id;
string name;
string creationTime;
string lastUpdated;
Object additionParents;
Object childDevices;
Object childAssets;
Object childAdditions;
Object deviceParents;
Object assetParents;
ActiveAlarmsStatus c8y_ActiveAlarmsStatus;
IsDevice c8y_IsDevice;
string ax_Customer;
sequence<string> c8y_SupportedMeasurements;
}
就在这里!一个完整的活动。非常感谢您的帮助和全面的回答,非常感谢,Gyan。你建议的解决办法很有效。亲切问候马蒂亚斯