我有一个包含某些字段的类,例如
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对象解释为大写。
我想到的潜在解决方法:
TEXT("text")
类似
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;则字符串将被错误地拆分。什么的。
答案 0 :(得分:4)
最简单的方法是为您的Enum使用@SerializedName注释。
public Enum Type {
@SerializedName("text")
TEXT,
@SerializedName("picture")
PICTURE
}
@SerializedName
不仅可用于大写,还可用于更改枚举或变量的名称,例如
public enum Gender {
@SerializedName("boy")
MALE,
@SerializedName("girl")
FEMALE
}
同样@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",