Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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
java中的JSON动态反序列化_Java_Json - Fatal编程技术网

java中的JSON动态反序列化

java中的JSON动态反序列化,java,json,Java,Json,我从服务器得到的Json休息如下所示 { "duration": 0, "taskSummaries": [ { "name": null, "id": 151, "priority": 0, "content": "{\"Comment\":\"Employee:{name}\",\"TaskName\":\"employeeForm\",\"GroupId\":\"

我从服务器得到的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/模型对象…根据我的编码标准,我必须遵循命名约定,例如任务摘要将是tskSumris,名称是nme,员工是Employee

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

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

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-->它有很多库,可以帮助你们动态(反)序列化JSON和Java POJO。它主要是使用注释完成的。 如果您不想这样做,您可以自己编写一些基于反射的代码。找到名称和类型与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

您是否直接从Pojo模型类生成Json?我所做的是获取数据,然后使用bean映射器将其映射到新的Pojo。新映射器中的每个元素都将有一个XMLElement标记来转换为相应的Json/XML。然后我们使用Jackson来转换它,并将其作为输出提供。因此,最后我有两个pojo,一个用于Hibernate,另一个用于映射到Json。

关于您的信息,我的示例pojo可能如下所示:@XmlAccessorType(XmlAccessType.FIELD)@XmlType(name=“ProcessKey”,propOrder={“prcsNme”,“dplyName”})公共类ProcessKey{@XmlElement(name=“prcsNme”,required=true)受保护字符串prcsNme;@xmlement(name=“DplyNme”,required=true)受保护字符串DplyNme;公共字符串getPrcsNme(){return prcsNme;}公共void setPrcsNme(字符串值){this.prcsNme=value;}公共字符串getDplyNme(){return DplyNme;}公共void setDplyNme(字符串值){this.dplyName=value;}}不,Akhil,我们通过调用服务器得到第三方的响应。分配变量很痛苦,所以我正在寻找动态解决方案。用一个示例编辑答案。你甚至可以下一个其他类型,即,如果你创建了一个Address类,并将其作为上述类中的一个字段,只要你正确地注释并保持默认的constructors一切正常。谢谢Arun。你的解决方案似乎对我有效。让我检查一下我是否可以修改我的模型。我只是碰巧正在处理一些需要相同的东西,所以幸运的连接!很高兴它能工作!它按照我想要的方式工作。但问题是我无法修改我的Pojo/模型。我正在与soluti的技术小组讨论在…上