简体   繁体   中英

Parse a String containing a JSON array to an Object

I succeeded to parse my object to a JSON array string:

public class MyClass extends JsonElement {

    private JsonArray array;

    public MyClass(String name, String role, String title) {
        this.array = new JsonArray();
        this.array.add(Objects.requireNonNull(name));
        this.array.add(Objects.requireNonNull(role));
        this.array.add(Objects.requireNonNull(title));
    }

    @Override
    public JsonElement deepCopy() {
        return array.deepCopy();
    }

    @Override
    public boolean isJsonArray() {
        return true;
    }

    @Override
    public JsonArray getAsJsonArray() {
        return array;
    }

}
Gson gson = new Gson();
MyClass obj = new MyClass("ab", "cd", "ef");
System.out.println(gson.toJson(obj)); // "["ab", "cd", "ef"]"

How can we do the opposite?

MyClass obj2 = gson.fromJson("[\"ab\", \"cd\", \"ef\"]", MyClass.class);

I got:

Exception in thread "main" com.google.gson.JsonSyntaxException: Expected a MyClass but was com.google.gson.JsonArray

I tried:

public class MyAdapter extends TypeAdapter<MyClass> {

    @Override
    public void write(JsonWriter out, CommunityTeamMember value) throws IOException {
        TypeAdapters.JSON_ELEMENT.write(out, value);
    }

    @Override
    public MyClass read(JsonReader in) throws IOException {
        JsonArray array = TypeAdapters.JSON_ELEMENT.read(in).getAsJsonArray();
        return new MyClass(array.get(0).getAsString(),array.get(1).getAsString(),array.get(2).getAsString());
    }

}
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(MyClass.class, new MyAdapter());
Gson gson = builder.create();

You've done some trickery by making your object behave as a JsonArray to the serializer, so you get a JsonArray back, but the deserializer only knows to put it into a JsonArray. To get back an instance of the class you had, you can add a constructor that takes a JsonArray

class MyClass extends JsonElement {
    private JsonArray array;

    public MyClass(String name, String role, String title) {
        this.array = new JsonArray();
        this.array.add(Objects.requireNonNull(name));
        this.array.add(Objects.requireNonNull(role));
        this.array.add(Objects.requireNonNull(title));
    }

    public MyClass(JsonArray jsonArray) {
        this.array = jsonArray;
    }

    @Override
    public JsonElement deepCopy() {
        return array.deepCopy();
    }

    @Override
    public boolean isJsonArray() {
        return true;
    }

    @Override
    public JsonArray getAsJsonArray() {
        return array;
    }

}

public class Main {
    public static void main(String[] args) {
        Gson gson = new Gson();
        MyClass obj = new MyClass("ab", "cd", "ef");
        String serialized = gson.toJson(obj);

        System.out.println(serialized); // "["ab", "cd", "ef"]"
        MyClass obj2 = new MyClass(JsonParser.parseString(serialized).getAsJsonArray());
        System.out.println(obj2.getAsJsonArray()); //["ab","cd","ef"]
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM