我正在开发一个模块,我从RESTful Web服务获取JSON响应。回复如下所示。
[{
"orderNumber": "test order",
"orderDate": "2016 - 01 - 25",
"Billing": {
"Name": "Ron",
"Address": {
"Address1": "",
"City": ""
}
},
"Shipping": {
"Name": "Ron",
"Address": {
"Address1": "",
"City": ""
}
}
}]
这不是完整的回复,只是为了解决问题而只考虑重要因素。
所以我需要做的是,将此JSON响应转换为我的应用程序理解并可以处理的另一个JSON。比如说下面的例子。
{
"order_number": "test order",
"order_date": "2016-01-25",
"bill_to_name": "Ron",
"bill_to_address": "",
"bill_to_city": "",
"ship_from_name": "Ron",
"ship_from_Address": "",
"ship_from_city": ""
}
我尝试过的想法是将我收到的响应中的JSONObject转换为使用JACKSON的hashmap,然后使用StrSubstitutor将我的应用程序json中的占位符替换为来自response json的正确值(带有占位符的My Application字符串如下所示)。
{"order_number":"${orderNumber}","order_date":"${orderDate}","bill_to_name":"${Billing.name}","bill_to_address":"${Billing.Address}","bill_to_city":"${Billing.City}","ship_from_name":"${Shipping.Name}","ship_from_Address":"${Shipping.Address}","ship_from_city":"${Shipping.City}"}
但我遇到的问题是
JSON to MAP没有使用嵌套的JSONOBJECT,如上面的响应所示。
另外要替换Billing.Name/Shipping.Name等,即使我从响应中提取Shipping / Billing JSONObjects,当我 将它们转换为hashmap,它们会给我Name,City, 地址1作为键而不是Billing.Name,Billing.City等。
作为一个解决方案,我编写了下面的代码片段,它将响应JSONObject(srcObject)和我的应用程序的JSONObject(destObject)作为输入,执行处理并适应从响应JSON到我的应用程序JSON的值。 / p>
public void mapJsonToJson(final JSONObject srcObject, final JSONObject destObject){
for(String key : destObject.keys()){
String srcKey = destObject.getString(key)
if(srcKey.indexOf(".") != -1){
String[] jsonKeys = srcKey.split("\\.")
if(srcObject.has(jsonKeys[0])){
JSONObject tempJson
for(int i=0;i<jsonKeys.length - 1;i++){
if(i==0) {
tempJson = srcObject.getJSONObject(jsonKeys[i])
} else{
tempJson = tempJson.getJSONObject(jsonKeys[i])
}
}
destObject.put(key, tempJson.getString(jsonKeys[jsonKeys.length - 1]))
}
}else if(srcObject.has(srcKey)){
String value = srcObject.getString(srcKey)
destObject.put(key, value)
}
}
}
这段代码的问题在于需要一些时间来处理。我想知道有没有一种方法可以用更少的处理时间以更好的方式实现这种逻辑?