繁体   English   中英

将包含 JSON 数组的字符串解析为 Object

[英]Parse a String containing a JSON array to an Object

我成功地将我的 object 解析为 JSON 数组字符串:

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"]"

我们怎样才能反其道而行之?

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

我有:

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

我试过了:

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();

您通过使 object 对序列化程序表现为 JsonArray,因此您得到了一个 JsonArray,但反序列化程序只知道将其放入 JsonArray。 要取回您拥有的 class 的实例,您可以添加一个采用 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"]
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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