Gson可以在给定Class上进行映射时修改已解析的数据

时间:2014-06-23 09:13:35

标签: java gson

我有以下JsonArray个文件

 [
  {
    "DateSent": "06/22/2014 11:09:11",
    "UserName": "santosh"
  }
]

我将它映射到以下AssistResponse

public class AssistResponse {

@SerializedName("DateSent")
private String dateSent;
@SerializedName("UserName")
public String userName;

public void setDateSent(String dateSent) {
    this.dateSent = dateSent;
    System.out.println(this.dateSent);
}

public String getDateSent() {
    return this.dateSent;
}

}

我可以很轻松地获得此类的List or Array。但我确实希望修改类dateSent的{​​{1}}属性,而AssistResponse映射类。含义Gson,请解析Gson文件,然后将值分配给Json。因此,在分配值时,我需要更改@SerializedName值。 dateSent包含dateSent值,但我想将其更改为server date。我可以使用local time然后迭代它并获得parsed List值,然后更改它。但是,在dateSent解析Json期间是否可以更改值,以便最后我不必再次迭代整个Gson

由于

2 个答案:

答案 0 :(得分:2)

您需要JsonDeserializer,您可以根据需要从JSON字符串将日期更改为本地日期,并在自定义POJO类中设置值,如下所示。

有关详细信息,请查看GSON Deserialiser Example

我已将其herehere发布在相同的上下文中,可能会帮助您更清楚地了解它。


您可以使用Date作为dateSent的数据类型,或者如果您不想更改,请将其保留原样。

示例代码:

class AssistResponse {

    @SerializedName("DateSent")
    private Date dateSent;
    @SerializedName("UserName")
    public String userName;
    // getter & setter
}


class AssistResponseDeserializer implements JsonDeserializer<AssistResponse> {

    @Override
    public AssistResponse deserialize(final JsonElement json, final Type typeOfT,
            final JsonDeserializationContext context) throws JsonParseException {

        JsonArray jsonArray = json.getAsJsonArray();
        JsonElement jsonElement = jsonArray.get(0);
        JsonObject jsonObject = (JsonObject) jsonElement;

        AssistResponse assistResponse = new AssistResponse();
        assistResponse.setUserName(jsonObject.get("UserName").getAsString());

        SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
        String dateString = jsonObject.get("DateSent").getAsString();
        try {
            Date date = dateFormat.parse(dateString);
            Date localDate=...              // <== here change it to local date
            assistResponse.setDateSent(localDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        return assistResponse;
    }
}
AssistResponse data = new GsonBuilder()
        .registerTypeAdapter(AssistResponse.class, new AssistResponseDeserializer())
        .create().fromJson(jsonString, AssistResponse.class);

System.out.println(new GsonBuilder().setPrettyPrinting().create().toJson(data));

答案 1 :(得分:0)

private String dateSent;

dateSent需要是一个字符串吗?你为什么不把它当作日期?

我认为你可以为此编写一个gson反序列化器。 您可以在反序列化器中修改日期并返回修改日期。

JsonDeserializer<Date> deser = new JsonDeserializer<Date>() {
  @Override
  public Date deserialize(JsonElement json, Type typeOfT,
       JsonDeserializationContext context) throws JsonParseException {
           Date newDate = //TODO: modifications;
           return newDate;

  }
};