我有这样的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"
}
}
}
}
问题是密钥1400364000
和1400104800
是可变的。如果我没有这个名字,怎么能把它放在@JsonProperty
?
我可以单独检索那些密钥1400364000,1400104800。如何从Optaf_matchdata
键中检索1400364000
,例如?
答案 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;
}