我必须解析一个有时看起来像的 json
school_name:“马丁高中”,领导:{ first_name:“Austin”,last_name:“Marriot”,}
有时作为
school_name:“马丁高中”,领导者:“/leader/3434”。
我试图看看是否有一个示例反序列化器可以将“领导者”有时处理为字符串,有时也处理为对象。但是什么都找不到。
这对gson有可能吗?
我必须解析一个有时看起来像的 json
school_name:“马丁高中”,领导:{ first_name:“Austin”,last_name:“Marriot”,}
有时作为
school_name:“马丁高中”,领导者:“/leader/3434”。
我试图看看是否有一个示例反序列化器可以将“领导者”有时处理为字符串,有时也处理为对象。但是什么都找不到。
这对gson有可能吗?
您只需要TypeAdapter
为您的Leader
. read(JsonReader in)
用于JsonReader.peek()
找出即将发生的内容并阅读它并将其转换为Leader
. 它应该是微不足道的。
我把它作为一个练习......
public class GsonStringOrObjectDemo {
@EqualsAndHashCode
private static class Leader {
String firstName;
String lastName;
}
private static class LeaderAdapter extends TypeAdapter<Leader> {
@Override
public void write(JsonWriter out, Leader value) throws IOException {
if (useString) {
out.value(value.firstName + ":" + value.lastName);
} else {
out.beginObject();
out.name("firstName");
out.value(value.firstName);
out.name("lastName");
out.value(value.lastName);
out.endObject();
}
useString = !useString;
}
@Override
public Leader read(JsonReader in) throws IOException {
final Leader result = new Leader();
final JsonToken type = in.peek();
switch (type) {
case BEGIN_OBJECT:
in.beginObject();
while (true) {
final String key = in.nextName();
final String value = in.nextString();
if (key.equals("firstName")) result.firstName = value;
else if (key.equals("lastName")) result.lastName = value;
else throw new JsonParseException("Unexpected key in Leader: " + key);
if (in.peek() == JsonToken.END_OBJECT) break;
}
in.endObject();
return result;
case STRING:
final String string = in.nextString();
final int pos = string.indexOf(':');
result.firstName = string.substring(0, pos);
result.lastName = string.substring(pos+1);
return result;
default:
throw new JsonParseException("Expected string or object for Leader, got: " + type);
}
}
private boolean useString;
}
public static void main(String[] args) throws Exception {
final Gson gson = new GsonBuilder().registerTypeAdapter(Leader.class, new LeaderAdapter()).setPrettyPrinting().create();
final Leader[] leaders = new Leader[10];
for (int i=0; i<leaders.length; ++i) {
leaders[i] = new Leader();
leaders[i].firstName = "First" + i;
leaders[i].lastName = "Last" + i;
}
final String json = gson.toJson(leaders);
final Leader[] leaders2 = gson.fromJson(json, Leader[].class);
Assert.assertTrue(Arrays.equals(leaders, leaders2));
}
}