繁体   English   中英

Java中的JSON动态反序列化

[英]JSON dynamic deserialization in java

我来自服务器的Json休养处如下所示

{
    "duration": 0,
    "taskSummaries": [
        {
            "name": null,
            "id": 151,
            "priority": 0,
            "content": "{\"Comment\":\"Employee:{name}\",\"TaskName\":\"employeeForm\",\"GroupId\":\"HR\",\"NodeName\":\"Employee Form\"}",
            "processId": "demoProject1.busiProce1",
            "description": null,
            "subject": null,
            "statusMessage": "Ready",
            "itemID": "com.demo.tp15:demoProject1:1.0",
            "potentialOwners": [
                {
                    "name": "mary",
                    "type": "USER"
                }
            ],
            "skippable": true,
            "actualOwner": null,
            "createdBy": null,
            "createdOn": null,
            "activationTime": 1412582092211,
            "processInstanceId": 172,
            "processSessionId": 0,
            "quickTaskSummary": null,
            "parentId": null
        }
    ],
    "statusMessage": "200",
    "itemID": null,
    "processInstanceId": 172,
    "startURL": null,
    "processAppID": "demoProject1.busiProce1",
    "processAppName": null,
    "processState": {
        "description": "Active",
        "code": 1
    },
    "dueDate": null,
    "startDt": null,
    "endDt": null,
    "parentProcessInstanceId": 0,
    "outcome": null,
    "identity": null,
    "processVersion": null,
    "processName": null,
    "externalId": null
}

而且我也无法控制我的pojo / model对象...按照我的编码标准,我必须遵循命名约定,例如taskSummaries将是tskSumris,名称是nme,Employee是empl ..

我的问题是:当json字符串和pojo中的名称不匹配时,我想将我的Json字符串动态分配给我的pojo / model。

我知道(实际上我也这样做过)如果我的名字匹配,那么我可以做这样的事情

private Object getDynamicObject(String jsonString,Class class1) throws JsonParseException, JsonMappingException, IOException{

     ObjectMapper mapper = new ObjectMapper();
     Object dynamicObject = null;        
     dynamicObject =  mapper.readValue(jsonString,  class1); 
    return dynamicObject;
}

你们能帮我吗?

试用Jackson-> http://jackson.codehaus.org/。它有一堆库,可帮助您动态(反)序列化JSON和Java pojos。 它主要使用注释来完成。 如果您不希望杰克逊的话,您可以自己编写一些基于反射的代码来执行相同的操作。 找到具有与JSON匹配的名称和类型的类变量,然后以与之相反的方式创建JSON。

好的,我刚刚注意到您提到您无法控制pojo变量名称。 因此,我建议您使用Jackson,在其中向pojo中的字段添加注释。 就像我说的那样,如果杰克逊不是您的选择,则可以创建自己的注释和实用程序代码来执行相同的操作。

编辑1:这是杰克逊的代码示例,请注意,字段名称和Json属性名称不必相同。

import java.io.StringWriter;

import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.map.ObjectMapper;

public class Test
{
    @JsonProperty(value="employeeName")
    private String empName;

    @JsonProperty(value="employeeAge")
    private int age;

    public static void main(String[] args) throws Exception
    {
        Test t = new Test();
        t.empName = "arun";
        t.age = 100;

        ObjectMapper m = new ObjectMapper();

        StringWriter w = new StringWriter();
        m.writeValue(w, t);
        w.close();
        String json = w.getBuffer().toString();
        System.out.println(json);

        Test t1 = m.readValue(json, Test.class);
        System.out.println(t1.empName);
        System.out.println(t1.age);
    }
}

控制台输出如下所示:

{"employeeName":"arun","employeeAge":100}
arun
100

您是直接从Pojo Model Class生成Json吗? 我要做的事情类似于我获取数据,然后使用bean映射器将其映射到新的Pojo。 并且新映射器中的每个元素都将具有XMLElement标记,以转换为相应的Json / XML。 然后,我们使用Jackson进行转换并将其作为输出提供。 所以最后我有两个Pojos,一个用于Hibernate,另一个用于映射到Json。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM