缩短将一个json对象映射到另一个json对象的处理时间

时间:2016-03-25 18:35:06

标签: java json jackson

我正在开发一个模块,我从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}"}

但我遇到的问题是

  1. JSON to MAP没有使用嵌套的JSONOBJECT,如上面的响应所示。

  2. 另外要替换Billing.Name/Shipping.Name等,即使我从响应中提取Shipping / Billing JSONObjects,当我 将它们转换为hashmap,它们会给我Name,City, 地址1作为键而不是Billing.Name,Billing.City等。

  3. 作为一个解决方案,我编写了下面的代码片段,它将响应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)
                }
            }
        }
    

    这段代码的问题在于需要一些时间来处理。我想知道有没有一种方法可以用更少的处理时间以更好的方式实现这种逻辑?

2 个答案:

答案 0 :(得分:1)

您应该为两种数据类型创建POJO,然后使用Jackson的映射器将REST数据反序列化为第一个POJO,然后在第二个POJO上有一个复制构造函数,它接受来自REST服务的POJO,并复制所有数据到其字段。然后,您可以使用Jackson的映射器将数据序列化为JSON。

只有当上述内容仍然存在性能问题时,我才开始考虑更快但更困难的算法,例如直接使用JsonParser / JsonGenerator来传输数据。

答案 1 :(得分:0)

我觉得标准方法是使用JSL等效的XSLT。 JOLT似乎就是这样一种实现。可以找到演示页面here。看看它。