Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apama 如何解析HTTP JSON响应负载中的值_Apama - Fatal编程技术网

Apama 如何解析HTTP JSON响应负载中的值

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 {

我对阿帕玛比较陌生。我使用的是v10.3.1。我将按照以下代码片段在监视器中执行REST请求:

当前处理响应的操作如下所示:


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。你建议的解决办法很有效。亲切问候马蒂亚斯