【问题标题】:Serialize Boolean to String Y or N in GSON在 GSON 中将布尔值序列化为字符串 Y 或 N
【发布时间】:2019-07-04 13:53:55
【问题描述】:

我已尝试使用此代码将 json 序列化/反序列化为 gson,反之亦然

public class BooleanSerializer implements JsonSerializer<Boolean>, JsonDeserializer<Boolean> {
    @Override
    public JsonElement serialize(Boolean src, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(src?"Y":"N");
    }

    @Override
    public Boolean deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        return json.toString().equalsIgnoreCase("Y");
    }
}

并像这样使用这个类

BooleanSerializer booleanSerializer = new BooleanSerializer();
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.registerTypeAdapter(Boolean.class, booleanSerializer);
        gsonBuilder.registerTypeAdapter(Boolean.class, booleanSerializer);
        Gson gson = gsonBuilder.create();
Event event = gson.fromJson(eventJObj.toString(), Event.class);

模型类是这样的

public class Event implements Parcelable {
    private long eventID;
    private String objective;
    private String typeOfEvent;
    private Boolean isBookmarked;
    private Boolean iAttended;
    private Boolean isFeatured;
}

而json格式是这样的

{
"eventID": 25,
"objective": "event",
"typeOfEvent": "conference",
"isBookmarked": "N",
"iAttended": "Y",
"isFeatured": "Y",
}

当我尝试将上述 json 转换为 Event 对象时,它无法将 Y 转换为 true 它始终保持值 false。另外,出于某种原因,必须为Event 对象扩展parcelable 类。

我哪里错了?

【问题讨论】:

    标签: android json gson


    【解决方案1】:

    我发现了错误。在BooeleanSerializer 类中的deserialize 方法是罪魁祸首。

    public class BooleanSerializer implements JsonSerializer<Boolean>, JsonDeserializer<Boolean> {
        @Override
        public JsonElement serialize(Boolean src, Type typeOfSrc, JsonSerializationContext context) {
            return new JsonPrimitive(src?"Y":"N");
        }
    
        @Override
        public Boolean deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
            // return json.toString().equalsIgnoreCase("Y"); // Wrong code
            return "Y".equalsIgnoreCase(json.getAsString()); 
           // json.getAsString() is the right way to get json element value
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-06
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多