1

我必须解析一个有时看起来像的 json

school_name:“马丁高中”,领导:{ first_name:“Austin”,last_name:“Marriot”,}

有时作为

school_name:“马丁高中”,领导者:“/leader/3434”。

我试图看看是否有一个示例反序列化器可以将“领导者”有时处理为字符串,有时也处理为对象。但是什么都找不到。

这对gson有可能吗?

4

1 回答 1

2

您只需要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));
    }
}
于 2012-07-31T14:15:21.647 回答