簡體   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