2014-10-06 87 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