我猜,逻辑是;
- 如果只有一个值,
valuejson标签应该是一个原语
细绳。
- 如果有多个值,
valuejson标签必须是一个
具有 name 字段的对象数组。
对于这种情况,您可以编写自定义TypeAdapter:
public class ValueTypeAdapter extends TypeAdapter<Value> {
@Override
public Value read(JsonReader in) throws IOException {
Value value = null;
JsonParser jsonParser = new JsonParser();
JsonElement je = jsonParser.parse(in);
if(je instanceof JsonPrimitive) {
value = new Value();
value.nameArr = new String[1];
value.nameArr[0] = ((JsonPrimitive)je).getAsString();
} else if (je instanceof JsonArray) {
JsonArray jsonArr = (JsonArray)je;
value = new Value();
value.nameArr = new String[jsonArr.size()];
for (int i = 0; i < jsonArr.size(); i++) {
JsonObject jo = (JsonObject)jsonArr.get(i);
value.nameArr[i] = jo.get("name").getAsString();
}
}
return value;
}
@Override
public void write(JsonWriter out, Value value) throws IOException {
if (value != null) {
if (value.nameArr != null && value.nameArr.length > 0) {
if (value.nameArr.length == 1) {
out.value(value.nameArr[0]);
} else if (value.nameArr.length > 1) {
out.beginArray();
for (String nameVal : value.nameArr) {
out.beginObject();
out.name("name").value(nameVal);
out.endObject();
}
out.endArray();
}
}
}
}
}
你的 POJO:
public class Item {
private String op;
private String path;
private Value value;
// TODO: Add Getters/Setters
}
public class Value {
private String[] nameArr;
// TODO: Add Getters/Setters
}
测试:
注意:我使用了您的类似 json 字符串。不同之处在于第二个数组项包含 2 个值。在这个测试中,您将看到反序列化将完成,itemArr 将被正确填充。同样在将itemArr序列化为json字符串后,你会看到结果与传入的测试json字符串值相同。
String json = "[{\"op\":\"replace\",\"path\":\"/path1\",\"value\":\"val1\"},{\"op\":\"replace\",\"path\":\"/path2\",\"value\":[{\"name\":\"val2\"},{\"name\":\"val3\"}]}]";
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Value.class, new ValueTypeAdapter());
Gson gson = gsonBuilder.create();
Item[] itemArr = gson.fromJson(json, Item[].class);
String serialized = gson.toJson(itemArr);
System.out.println("serialized:" + serialized);
// NOTE: serialized output is same with incoming test value
您可以从this site 阅读有关 TypeAdapters 的更多信息。