gpt4 book ai didi

java - 解析包含原语和对象的 JSONArray

转载 作者:行者123 更新时间:2023-12-02 12:22:05 25 4
gpt4 key购买 nike

我有 JSON 响应,如下所示:

{
"response":[
"Some number (for example 8091)",
{
"Bunch of primitives inside the first JSONObject"
},
{
"Bunch of primitives inside the second JSONObject"
},
{
"Bunch of primitives inside the third JSONObject"
},

... (and so on)

]
}

所以它是一个第一个整数元素的数组,其他元素是 JSONObject。我不需要解析整数元素。那么我该如何使用 GSON 来处理它呢?

最佳答案

我将通过创建自定义 JsonDeserializer 并在解析之前将其注册到您的 Gson 实例来解决此问题。此自定义反序列化器将设置为处理 int 和真实对象。

首先,您需要构建一系列模型对象来表示数据。这是一个看起来像这样的模板:

private static class TopLevel {

@SerializedName("response")
private final List<ResponseElement> elements;

private TopLevel() {
this.elements = null;
}
}

private static class ResponseInteger implements ResponseElement {

private final int value;

public ResponseInteger(int value) {
this.value = value;
}
}

private static class ResponseObject implements ResponseElement {

@SerializedName("id")
private final String id;

@SerializedName("text")
private final String text;

private ResponseObject() {
this.id = null;
this.text = null;
}
}

private interface ResponseElement {
// marker interface
}

TopLevelResponseObject 有私有(private)构造函数,因为它们将让 Gson 使用反射设置它们的字段,而 ResponseInteger 有一个公共(public)构造函数,因为我们将从自定义解串器中手动调用它。

显然,您必须使用 ResponseObject 的其余字段来填写。

解串器相对简单。您发布的 json 仅包含两种元素,我们将利用它。每次调用反序列化器时,它都会检查该元素是否是原语,如果是,则返回 ResponseInteger(如果不是,则返回 ResponseObject)。

private static class ResponseElementDeserializer implements JsonDeserializer<ResponseElement> {

@Override
public ResponseElement deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
if (json.isJsonPrimitive()) {
return new ResponseInteger(json.getAsInt());
}
else {
return context.deserialize(json, ResponseObject.class);
}
}
}

要使用此反序列化器,您必须使用 GsonBuilder 对象将其注册到 Gson。

private static Gson getGson() {
return new GsonBuilder()
.registerTypeAdapter(ResponseElement.class, new ResponseElementDeserializer())
.create();
}

就是这样。现在您可以使用这个Gson对象轻松解析TopLevel对象!

public void parseJson() {
TopLevel t = getGson().fromJson(json, TopLevel.class);

for (ResponseElement element : t.elements) {
System.out.println(element);
}
}
8061
[450602: Поздравляем!]
[451700: С реакцией чата и рассуждениями Папани после рипа..]
[451578: Помним...Любим...Скорбим...<br>2107 забирает лучших]
[451371: Земля тебе пухом братишка]
[451332: Доигрался, минус 900 экзов<br><br>R I P]
[451269: ]
[451242: https://www.twitch.tv/arthas подрубка<br><br>evilpapech.ru - скидка 30% на футболки!]
[451217: ]
[451181: или так це жерстко?]
[451108: ]

我使用了这些 toString() 方法,为简洁起见,我在上面省略了这些方法:

    @Override
public String toString() {
return Integer.toString(value);
}

@Override
public String toString() {
return "[" + id + ": " + text + "]";
}

关于java - 解析包含原语和对象的 JSONArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45696825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com