Java 解析包含原语和对象的JSONArray
我的JSON响应如下所示:Java 解析包含原语和对象的JSONArray,java,android,arrays,json,gson,Java,Android,Arrays,Json,Gson,我的JSON响应如下所示: { "response":[ "Some number (for example 8091)", { "Bunch of primitives inside the first JSONObject" }, { "Bunch of primitives inside the second JSONObject" }, { "Bunch o
{
"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处理它呢?基本上,这个结构对于JSON数据来说是错误的格式。 你需要删除这个数字,或者把这个数字放在同一个对象中,就像下面的对象Objuta一样,这是一个Objuta数组。 那一切都会好起来的。请尝试以下代码:
public class Response {
@SerializedName("response")
@Expose
public List<ObjectA> objectA = null;
}
public class ObjectA {
@SerializedName("value")
@Expose
public Integer value;
@SerializedName("description")
@Expose
public String description;
}
Response response = new Gson().fromJson(responseString, Response.class);
试试这个
Gson gson = new Gson();
// Reading from a file.
Example example = gson.fromJson(new FileReader("D:\\content.json"), Example.class);
波乔
请使用以下ValueObject格式,该格式不分析第一个整数元素
public class ResponseVO {
public List<Response> response = new ArrayList();
public class Response {
public final long id;
public final long from_id;
...
}
}
我将通过创建一个自定义JsonDeserializer并在解析之前将其注册到Gson实例来解决这个问题。这个自定义反序列化程序将被设置为同时处理int和real对象 首先,需要建立一系列模型对象来表示数据。下面是一个模板,它可能看起来像什么:
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
}
要使用此反序列化程序,必须使用GsonBuilder对象向Gson注册它
就这样。现在您可以使用这个Gson对象轻松解析顶级对象了
这是一个无效的JSON文档。你能粘贴真实的回应吗?这是真实的-。抱歉,无法显示请求,因为它使用令牌。感谢您的帮助。看看我的答案,让我知道它是否有效。这个json虽然有效,但没有意义。您是否控制生成此json的API?
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
}
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);
}
}
}
private static Gson getGson() {
return new GsonBuilder()
.registerTypeAdapter(ResponseElement.class, new ResponseElementDeserializer())
.create();
}
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: ]
@Override
public String toString() {
return Integer.toString(value);
}
@Override
public String toString() {
return "[" + id + ": " + text + "]";
}