java - java中JSON动态反序列化

标签 java json

我的 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,name 是 nme,Employee 是 empl ..

我的问题是: 当 json String 和 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 pojo。它主要是使用注释来完成的。 如果您不想使用 Jackson,您可以自己编写一些基于反射的代码来执行相同的操作。找到名称和类型与 JSON 匹配的类变量,反之亦然以创建 JSON。

好吧,我刚刚注意到你提到你无法控制 pojo 变量名称。所以我建议使用 Jackson 为 pojo 中的字段添加注释。就像我说的,如果 Jackson 不适合您,您可以创建自己的注释和实用程序代码来执行相同的操作。

编辑1: 下面是 Jackson 的代码示例,注意字段名称和 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

关于java - java中JSON动态反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26214508/

相关文章:

java - Jersey 在序列化期间省略 XmlTransient 注释

.net - 如何将 JSON 响应中的 ASP.NET WebMethod 的 'd' 标识符更改为不同的名称?

Java 泛型和数字类型

json4s org.json4s.package$映射异常 : Do not know how to convert JString into double

java - 方法的输出可以用于 Autowiring 另一个 bean 吗?

java - 如何从 JPA EntityManager 获取返回的对象作为自定义 bean

json - 如何在 Swift 上通过 Mashape 打印 JSON 数据?

android - 数据未进入回收站 View 项目

java - collectingAndThen方法足够高效吗?

java - 如何实现与 UI 无关的后台工作任务