1

時々次のように見えるjsonを解析する必要があります

school_name:"Martin High School", Leader: { first_name: "Austin", last_name: "Marriot", }

そして時には

school_name:"Martin High School", リーダー: "/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 に答える