gson intrepret特定字段为大写

时间:2014-03-20 18:26:24

标签: java json serialization enums gson

我有一个包含某些字段的类,例如

public class Message {

    public Enum Type {
        TEXT,
        PICTURE;
    }

    private Type type;
    private String text;
    private int id;
}

我们说我有一个类似以下的json

[ { "id" : "1",
    "data" : "hello",
    "type" : "text",
  },
  { "id" : "2",
    "data" : "<someImageUrl>",
    "type" : "picture",
  },
]

我可以通过调用

轻松地反序列化它
Gson gson = new Gson();
ArrayList<Message> messages = gson.fromJson(jsonResult, new TypeToken<List<Message>>() {}.getType());

冷却。不幸的是,Type字段保持为null,因为json对象和枚举中定义的实例之间存在套管差异。如何改变gson的行为,以便将json Type对象解释为大写。

我想到的潜在解决方法:

  • 将序号值分配给枚举类型,该值将与json中给出的内容相匹配(即TEXT("text")
  • 通过分隔字符&#34;},&#34;
  • 拆分json结果
  • 将所有出现的-someEnumType-替换为-SOMEE​​NUMTYPE -

类似

public enum Type {
    TEXT("text"),
    PICTURE("picture");

    private final String value

    private MessageType(String value) {
        this.value = value;
    }

    public String getValue() {
        return value
    }
}
...

   String[] jsonResultSplit = StringUtils.split(jsonResult, "},") 
   for (String jsonMessage : jsonResultSplit) {
        for (MessageType messageType : MessageType.values()) {
            if (jsonMessage.contains("\"type:\" : \"" + messageType.getValue() + "\"")) {
                jsonMessage.replace(
                        "\"type:\" : \"" + messageType.getValue() + "\"",
                        "\"type:\" : \""
                                + StringUtils.capitalize(messageType.getValue() + "\""));
            }
        }
    }
    jsonResult = StringUtils.join(jsonResultSplit);
    Gson gson = new Gson();
    ArrayList<Message> messages = gson.fromJson(jsonResult, new TypeToken<List<Message>>() {}.getType());

然而,这似乎有点hacky,如果消息包含&#34;},&#34;则字符串将被错误地拆分。什么的。

2 个答案:

答案 0 :(得分:4)

最简单的方法是为您的Enum使用@SerializedName注释。

public Enum Type {
    @SerializedName("text")
    TEXT,

    @SerializedName("picture")
    PICTURE
}

@SerializedName不仅可用于大写,还可用于更改枚举或变量的名称,例如

public enum Gender {
    @SerializedName("boy")
    MALE,

    @SerializedName("girl")
    FEMALE
}

Reference

同样@Sotirios建议,您需要注释text以使用您的变量映射json密钥。

 @SerializedName("data")
 private String text;

您现在可以使用Gson反序列化您的json

Gson gson = new Gson();
ArrayList<Message> messages = gson.fromJson(jsonResult, new TypeToken<List<Message>>() {}.getType());

希望这会有所帮助......

答案 1 :(得分:2)

您必须注册自己的TypeAdapter才能进行转化

Gson gson = new GsonBuilder().registerTypeAdapter(Type.class,
            new TypeAdapter<Type>() {

                @Override
                public void write(JsonWriter out, Type value)
                        throws IOException {
                    out.value(value.name().toLowerCase());
                }

                @Override
                public Type read(JsonReader in) throws IOException {
                    return Type.valueOf(in.nextString().toUpperCase());
                }
            }).create();

请注意,您还应注释

private String text;

@SerializedName("data"),因为它与JSON名称不匹配。

"data" : "hello",