2014-10-06 44 views
0
从服务器

的json养神看起来像下面在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 /模型对象也控制......按我的编码标准,我必须遵循命名约定例如taskSummaries将tskSumris,名字是NME,员工是empl的..

我的问题在这里: 我想我的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; 
} 

你们能帮帮我。

+0

为了您的信息,我的样本POJO可能看起来像下面: – Manjeet 2014-10-06 10:45:46

+0

@XmlAccessorType(XmlAccessType.FIELD) @XmlType(NAME = “ProcessKey”,propOrder = { “prcsNme”, “dplyNme” }) 公共类ProcessKey { @XmlElement(name =“PrcsNme”,required = true) protected String prcsNme; @XmlElement(name =“DplyNme”,required = true) protected String dplyNme; public String getPrcsNme(){ return prcsNme; } 公共无效setPrcsNme(字符串值){ this.prcsNme =值; } 公共字符串getDplyNme(){ 返回dplyNme; } 公共无效setDplyNme(字符串值){ 此。dplyNme =值; } } – Manjeet 2014-10-06 10:48:47

回答

1

尝试杰克逊 - >http://jackson.codehaus.org/它有一堆库,它可以帮助你动态(德)序列化JSON和Java pojos。它主要是使用注释完成的。 如果你不想要杰克逊,你可以自己写一些基于反射的代码来做同样的事情。找到具有与JSON匹配的名称和类型的类变量,类似地创建JSON。

好的我刚刚注意到你提到你不能控制pojo变量名。所以我建议使用Jackson在pojo中的字段中添加注释。就像我说的,如果杰克逊不适合您,您可以创建自己的注释和实用程序代码。

编辑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 
+0

请问您可以举一些代码示例。 – Manjeet 2014-10-06 12:49:48

+0

用样本编辑答案。 – 2014-10-06 13:46:00

+0

甚至可以使用其他类型,即如果您创建了Address类并将其作为上述类中的字段,只要您正确注释并保留默认构造函数,它将一切正常。 – 2014-10-06 13:52:12

0

你直接从POJO的模型类产生JSON的?我所做的就像我获取数据,然后使用bean映射器将其映射到新的Pojo。新的映射器中的每个元素都会有一个XMLElement标记以转换为相应的Json/XML。然后我们用Jackson来转换它并将其作为输出提供。所以最后我有两个用于Hibernate的Pojos,一个用于映射到Json。

+0

没有Akhil,我们通过调用服务器获得来自第三方的响应。 – Manjeet 2014-10-06 11:05:39

+0

它很痛苦得分配变量,所以我正在寻找动态解决方案。 – Manjeet 2014-10-06 11:12:50