反序列化具有键变量jackson map ObjectMapper的JSON文件

时间:2014-04-30 12:28:48

标签: java android jackson mapper

我有这样的JSON:

{
    "flux":{
        "1400364000":{
            "Optaf_matchdata":{
                "uid":"749674", "fk_comp_id":"2414", "comp_id":"112", "saisonid":"2013", "temps":null, "matchday":"40"
            }
        },
        "1400104800":{
            "Optaf_matchdata":{
                "uid":"749670", "fk_comp_id":"2414", "comp_id":"112", "saisonid":"2013", "temps":null, "matchday":"39"
            }
        }
    }
}

问题是密钥14003640001400104800是可变的。如果我没有这个名字,怎么能把它放在@JsonProperty

我可以单独检索那些密钥1400364000,1400104800。如何从Optaf_matchdata键中检索1400364000,例如?

2 个答案:

答案 0 :(得分:2)

我通过添加客户反序列化来解决这个问题:

 @JsonIgnoreProperties(ignoreUnknown = true)
public class CalendarResultsDto {
@JsonDeserialize(using=JsonMatchDeserialize.class)
@JsonProperty(value="flux")

所以在那之后返回一个Map witch String它是关键。 JsonMatchDeserialize.java:

公共类JsonMatchDeserialize扩展了JsonDeserializer> {

@Override
public Map<String, CalendarMatchDataDto> deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
        throws IOException, JsonProcessingException {

    Map<String, CalendarMatchDataDto> mapToReturn = new  HashMap<String, CalendarMatchDataDto>();
    JSONObject flux;
    try {
        flux = new JSONObject(jsonParser.getValueAsString());
        ObjectMapper mapper = new ObjectMapper();
         Iterator<String> iter = flux.keys();
            while (iter.hasNext()) {
                String key = iter.next();
                try {
                    Object value = flux.get(key);
                    CalendarMatchDataDto calendarMatchDataDto =  mapper.readValue(value.toString(), CalendarMatchDataDto.class); 
                    if(key!=null && calendarMatchDataDto!=null)
                        mapToReturn.put(key, calendarMatchDataDto);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
    } catch (JSONException e1) {
        e1.printStackTrace();
    }




    return mapToReturn;



}

和CalendarMatchDataDto.java

    public class CalendarMatchDataDto {

@JsonProperty(value="Optaf_matchdata")
public MatchDto matchDto ;
       }

答案 1 :(得分:0)

更新:我刚刚意识到您正在使用Jackson自动转换您的JSON,而不是像我建议的那样手动解析它。我之前的回答可能根本不符合您的需求。

我的意思是:那些变量键是什么?它们应该是一个名为&#34; id&#34;什么的。

此外,您应该考虑使用JSON数组。

以下是您的JSON应该是什么样子的示例:

{
   "flux":[
      {
         "id":"1400364000",
         "Optaf_matchdata":{
            "uid":"749674", "fk_comp_id":"2414", "comp_id":"112", "saisonid":"2013", "temps":null, "matchday":"40"
         }
      },
      {
         "id":"1400104800",
         "Optaf_matchdata":{
            "uid":"749670", "fk_comp_id":"2414", "comp_id":"112", "saisonid":"2013", "temps":null, "matchday":"39"
         }
      }
   ]
}

原始回答

  

如何从此键1400364000获取其Optaf_matchdata,例如

不确定我理解你的问题,但这是我试图回答的问题。

您可以使用getJSONObject()方法:

JSONObject source = new JSONObject(jsonString);
JSONObject flux = source.getJSONObject("flux");
JSONObject item = flux.getJSONObject("1400364000"); // this string can be dynamic
JSONObject optafMatchData = item.getJSONObject("Optaf_matchdata");

您甚至可以迭代flux对象的所有键(类似1400364000的键):

JSONObject source = new JSONObject(jsonString);
JSONObject flux = source.getJSONObject("flux");
Iterator<?> keys = flux.keys();
while(keys.hasNext()){
    String key = (String) keys.next();
    JSONObject item = flux.getJSONObject(key);
    JSONObject optafMatchData = item.getJSONObject("Optaf_matchdata");
    // do whatever with this item/match data
}

然后你可能想编写一个从JSON解析OptafMatchData对象的方法:

private static OptafMatchData parseMatchData(JSONObject item) throws JSONException {
    OptafMatchData omd = new OptafMatchData();
    omd.setUid(item.getLong("uid"));
    omd.setFkCompId(item.getLong("fk_comp_id"));
    omd.setCompId(item.getLong("comp_id"));
    // and so on...
    return omd;
}