我可以使用带有Seri​​alizedName的GSON访问JSON的内层

时间:2015-04-24 04:33:03

标签: android gson

假设有一个像这样的JSON

{
  "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);

2 个答案:

答案 0 :(得分: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;
    }

答案 1 :(得分:-1)

我不知道如何以@SerializedName("user.f_name")方式归档,如何 但由于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);

我希望它会有所帮助。