2014-04-30 3 views
1

У меня есть JSON как это:Deserialize файла JSON, который имеет ключевую переменную карту Джексона ObjectMapper

{ 
    "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" 
      } 
     } 
    } 
} 

Проблема заключается в том, что ключи 1400364000 и 1400104800 являются переменными. Как я могу поместить это в @JsonProperty, когда у меня нет имени?

Я могу получить эти ключи 1400364000, 1400104800 отдельно. Как я могу получить Optaf_matchdata с ключа 1400364000?

+0

@nikis Вы добавили недостающую фигурную скобку в формате JSON, может быть, это должно быть указано вне. – Joffrey

+0

Возможно, я стараюсь держать только важную часть Json, что вызывает у меня проблема я удалить все другие части Вот полный JSON www.thefanclub.com/appsfootball/calendrierbyteamid/241/0/active.ijson – tamtoum1987

+0

OK, оригинальный JSON кажется правильным, вы, вероятно, удалили эту фигурную скобку, отрубив ненужные части JSON. – Joffrey

ответ

2

я решить эту проблему путем добавления десериализации клиентов, как это:

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

Так после этого возвращать карту ведьмой Строка это ключ. 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 ; 
     } 
0

UPDATE: Я только понял, что вы использовали Джексон для автоматического преобразования вашего JSON вместо того, чтобы вручную разглашать его, как я предложил. Мой предыдущий ответ может не соответствовать вашим потребностям.

Мое замечание было бы следующим: какие эти переменные ключи? Вероятно, это должно быть значение для ключа с именем «id» или что-то еще.

Кроме того, вам следует рассмотреть возможность использования массива 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" 
     } 
     } 
    ] 
} 

ОРИГИНАЛЬНЫЙ ОТВЕТ

, как я могу получить их Optaf_matchdata из этого ключа 1400364000, например,

Не уверен, что я понял ваш вопрос, но вот моя попытка ответить.

Вы можете использовать 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 
} 

Тогда вы можете написать метод, который будет анализировать объект OptafMatchData от JSON:

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; 
}