2015-04-24 2 views
4

Пусть говорят, что есть JSON, как этотМогу ли я получить доступ внутренний слой JSON, используя GSON с SerializedName

{ 
    "data" : { 
    "messages" : { 
     "count" : 2, 
     "data" : [ 
     "message 1", 
     "message 2" 
     ] 
    }, 
    "user" : { 
     "f_name" : "Mark", 
     "l_name" : "lewis" 
    }, 
    "city" : "London", 
    "address" : "221b Baker Street, London" 
    } 
} 

Могу ли я чего-то добиться, как это с GSON?

public class JSData { 
    public String city; 
    public String address; 
    public Array messages; 
    @SerializedName("user.f_name") 
    public String firstName; 
    @SerializedName("user.l_name") 
    public String lastName; 
} 

Я хочу получить доступ к user.f_name напрямую, так что я не должен создавать оболочку для user и может непосредственно преобразовать его с помощью

JSData topic = gson.fromJson(jsonObj, JSData.class); 
+0

Я думаю, что вам нужно обязательно создать класс User для сопоставления пользовательского json-объекта. –

+0

Это сообщение может помочь вам http://stackoverflow.com/questions/12029367/parsing-json-using-google-gson-reading-values-directly-from-child-objects –

ответ

0

Я думаю, что вы должны создать пользовательский класс, как этот

public class User { 
     @SerializedName("f_name") 
     public String firstName; 

     @SerializedName("l_name") 
     public String lastName; 
    } 

    public class JSData { 
     public String city; 
     public String address; 
     public Array messages; 

     @SerializedName("user") 
     public User user; 
    } 
+0

Я знаю, как это использовать, но я интересно, могу ли я взять f_name и l_name и поместить его в JSData без создания оболочки 'User'. –

+0

Я думаю, что у нас есть сложное решение, используя JsonDeserializer. – Phien

-1

Не знаю, как архивировать @SerializedName("user.f_name") как путь,
, но внутреннее поле сглаживается в архиве t hanks до JsonDeserializer.

Предположим, что мы имеем

{ 
    "publishDate": { 
    __type: "Date", 
    iso: "2014-11-05T02:27:00.000Z" 
    }, 
... 
} 

и мы хотим преобразовать внутреннее поле "ISO" в верхней "publishDate", как Date.

Итак, класс JsData выглядит следующим образом.

public class JsData { 
    // publishDate is JSONObject. but get it as Date! 
    public Date publishDate; 
    ... 
} 

Реализует JsonDeserializer<Date> и зарегистрироваться gson в архив пользовательских десериализации. Когда gson обнаружит поле Date, эта реализация будет вызываться.

public static class PublishDateDeserializer implements JsonDeserializer<Date> { 
    @Override 
    public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) 
     throws JsonParseException { 
     // this deserializer is only for "publishDate" 
     // real json is jsonobject. get inner "iso" 
     String iso = json.getAsJsonObject().get("iso").getAsString(); 
     DateFormat parser = new SimpleDateFormat(DATE_JSON_PATTERN); 
     try { 
     return parser.parse(iso); 
     } catch (ParseException e) { 
     throw new JsonParseException(e); 
     } 
    } 
    } 

Затем зарегистрироваться через строитель

Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new PublishDateDeserializer()).create(); 
gson.fromJson(json, JsData.class); 

Я надеюсь, что это поможет.

+0

Я думаю, что этот ответ, похоже, не соответствует действительности. Он хочет поместить внутренний массив в JSData без какого-либо другого класса-оболочки. –

+0

Да, я знаю, что это не идеальное решение. но внутреннее поле ('f_name' для него,' iso' для меня) преобразуется в верхний уровень. Что означает «класс обертки»? – ytRino

Смежные вопросы