2017-02-17 79 views
1

什麼是獸的方式來處理JSON對象,其具有以下結構:爪哇傑克遜解析動態JSON對象

{ 
    "Parameters": { 
    "0": { 
     "some key 0": "some value 0" 
    }, 
    "1": { 
     "some key 1": "some value 1" 
    }, 
    "2": { 
     "some key 2": "some value 2" 
    }, 
    .... 
    "n": { 
     "some key n": "some value n" 
    } 
} 

它包含至n(例如,100)從0屬性,每個屬性是一個具有單個鍵值的對象。看起來所有的鍵都不一樣。

是否有可能將其改造成的Parameter一個列表,其中每個參數都有一個結構:

public class Parameter { 
    String key; 
    String value; 
} 

什麼是傑克遜來處理的最佳方式?

+0

使用'ObjectMapper' @RostyslavRoshak –

+0

檢查此:http://stackoverflow.com/questions/6349421/how-to-use-jackson-to-deserialise-an-array-of-objects – Maddy

+0

我不知道內部JSON對象的鍵名稱。 –

回答

1

我認爲薩欽的做法是正確的方向,但我會修改它在以下方法,並刪除一些嵌套的地圖,它結束了:

@JsonRootName("Parameters") 
public class Parameters { 
    private List<Parameter> parameters = new ArrayList<>(); 

    @JsonAnySetter 
    public void setDynamicProperty(String _ignored, Map<String, String> map) { 
     Parameter param = new Parameter(); 
     param.key = map.keySet().iterator().next(); 
     param.value = map.values().iterator().next(); 
     parameters.add(param); 
    } 

    public List<Parameter> getParameters() { 
     return parameters; 
    } 
} 

public class Parameter { 
    public String key, value; 
} 

反序列化後,getParameters()方法將返回一個Parameter實例的列表。鑑於你的輸入例,其結構如下所示,當序列化JSON:

[ 
    { 
    "key": "some key 0", 
    "value": "some value 0" 
    }, 
    { 
    "key": "some key 1", 
    "value": "some value 1" 
    }, 
    { 
    "key": "some key 2", 
    "value": "some value 2" 
    }, 
    { 
    "key": "some key n", 
    "value": "some value n" 
    } 
] 

注意的keyvalue提取使用的迭代器,如果它遇到一個空的對象,它會拋出異常。

2

如果鍵是動態的,那麼我們可以使用@JsonAnySetter註釋。

你可以嘗試這樣的事情:

ObjectMapper mapper = new ObjectMapper(); 
mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); 

Parameters parameters = mapper.readValue(jsonData, Parameters.class); 

Parameter類的內容將是:

@JsonRootName("Parameters") 
class Parameters { 
    private List<Map<String, String>> parameters = new ArrayList<Map<String, String>>(); 

    @JsonAnySetter 
    public void setDynamicProperty(String name, Map<String, String> map) { 
     parameters.add(map); 
    } 

    public List<Map<String, String>> getParameters() { 
     return parameters; 
    } 

    public void setParameters(List<Map<String, String>> parameters) { 
     this.parameters = parameters; 
    } 

} 
+0

問題是我們在json中沒有對象數組。 「0」,「1」是json對象的字段。 –

+0

是的,這就是爲什麼我使用@JsonAnySetter註釋。 –

+0

此代碼與您的json示例正常工作。 –