2017-08-15 46 views
0

我有JSON应答,其看起来像这样:解析JSONArray含有原始和对象

{ 
    "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来处理它?

+1

这是一个无效JSON文档。你能粘贴真实的回应吗? –

+1

这是真实的 - https://pastebin.com/uW9qBa6s。对不起,无法显示请求导致它使用令牌。 –

+0

感谢您的帮助。看到我的回答,并让我知道它是否有效 –

回答

1

我会通过创建一个自定义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有私有的构造,因为它们将让GSON使用反射设置各自的领域,而ResponseInteger有一个公共的构造函数,因为我们要手动调用它来自我们的自定义解串器。

显然你必须填写ResponseObject与其余的领域。

解串器相对简单。你发布的json只包含两种元素,我们将利用它。每次调用解串器时,它都会检查元素是否为基元,如果是(否则返回ResponseInteger),否则返回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 + "]"; 
    } 
0

基本上这个结构是JSON数据的错误格式。 您需要删除数字,或将此数字作为字段放在同一个对象中(如下所示)(调用ObjectA),并将其视为ObjectA的数组。 然后一切都应该很好。试试下面的代码:

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

试试这个

Gson gson = new Gson(); 

// Reading from a file. 
Example example = gson.fromJson(new FileReader("D:\\content.json"), Example.class); 

POJO

package com.example; 

public class Example { 

private List<Integer> response = null; 

public List<Integer> getResponse() { 
return response; 
} 

public void setResponse(List<Integer> response) { 
this.response = response; 
} 

} 
0

请使用以下的ValueObject格式不解析第一个整数元素

public class ResponseVO { 
    public List<Response> response = new ArrayList(); 
    public class Response { 
     public final long id; 
     public final long from_id; 
     ... 
    } 
}