如何正确解析使用GSON的这个json字符串。 JsonObject返回空,没有解析错误

问题描述:

我有一个数据结构如下如何正确解析使用GSON的这个json字符串。 JsonObject返回空,没有解析错误

{“testString”:“一些字符串”,“成功”:真,“原因”:空,“数据”:{“网络“:[{”networkId“:”1“,”networkName“:”some area“,”networkType“:1},{”networkId“:”4“,”networkName“:”another place“,”networkType“ 1}]}}

因此,基本上它是与第一你键/值对是一个1)字符串2)布尔3)字符串和第四阵列对象被一个JSONObject

的Object我使用作为所有这些数据的容器是

public class ContainerData { 


private boolean success; 
private String reason; 

private JSONObject data; 

private String testString; 

public String getTestString(){ 
    return this.testString; 
} 
public void setTestString(String test){ 
    this.testString = test; 
} 

public boolean getSuccess() { 
    return this.success; 
} 

public void setSuccess(boolean success) { 
    this.success = success; 
} 

public String getReason() { 
    return this.reason; 
} 

public void setReason(String reason) { 
    this.reason = reason; 
} 

public JSONObject getData() { 
    return this.data; 
} 

public void setData(JSONObject data) { 
    this.data = data; 
} 
} 

我解析它像这样withr esponse对象是JSON字符串

Gson gson = new GsonBuilder().serializeNulls().create(); 
    responseObject = gson.fromJson(response,ContainerData.class); 

我能值以外的所有的JSONObject它总是返回在那里我搞乱了一个空数组如{}任何想法?

+0

为什么使用JSONObject而不是反序列化为友好的结构?为什么使用JSONObject而不是com.google.gson.JsonObject? – 2011-05-31 11:01:43

下面是一个与您提供的JSON输入一起工作的方法,但更“完全”反序列化成友好的数据结构。

输出是

[ContainerData: success=true, reason=null, testString=some string, data=[Data: networks=[ 
[Network: networkId=1, networkName=some area, networkType=1], 
[Network: networkId=4, networkName=another place, networkType=1] 
]]]
public class Foo 
{ 
    static String jsonInput = 
    "{" + 
     "\"testString\":\"some string\"," + 
     "\"success\":true," + 
     "\"reason\":null," + 
     "\"data\":" + 
     "{" + 
     "\"networks\":" + 
     "[" + 
      "{\"networkId\":\"1\",\"networkName\":\"some area\",\"networkType\":1}," + 
      "{\"networkId\":\"4\",\"networkName\":\"another place\",\"networkType\":1}" + 
     "]" + 
     "}" + 
    "}"; 

    public static void main(String[] args) 
    { 
    GsonBuilder gsonBuilder = new GsonBuilder(); 
    Gson gson = gsonBuilder.create(); 
    ContainerData container = gson.fromJson(jsonInput, ContainerData.class); 
    System.out.println(container); 
    } 
} 

class ContainerData 
{ 
    private boolean success; 
    private String reason; 
    private String testString; 
    private Data data; 

    @Override 
    public String toString() 
    { 
    return String.format(
     "[ContainerData: success=%1$b, reason=%2$s, testString=%3$s, data=%4$s]", 
     success, reason, testString, data); 
    } 
} 

class Data 
{ 
    private Network[] networks; 

    @Override 
    public String toString() 
    { 
    return String.format(
     "[Data: networks=%1$s]", 
     Arrays.toString(networks)); 
    } 
} 

class Network 
{ 
    private String networkId; 
    private String networkName; 
    private int networkType; 

    @Override 
    public String toString() 
    { 
    return String.format(
     "[Network: networkId=%1$s, networkName=%2$s, networkType=%3$d]", 
     networkId, networkName, networkType); 
    } 
} 
+0

谢谢,我使用了类似的解决方案 – Brian 2011-06-01 06:19:17

我已经解析了你上面提到的JSON字符串。它没有使用GSON来解析JSON。请尝试这一点。我认为它会解决您的问题:

String jsonString = "{\"testString\":\"some string\",\"success\":true,\"reason\":null,\"data\":{\"networks\":[{\"networkId\":\"1\",\"networkName\":\"some area\",\"networkType\":1},{\"networkId\":\"4\",\"networkName\":\"another place\",\"networkType\":1}]}}"; 

       JSONObject jObject = new JSONObject(jsonString); 

       String menuObject = jObject.getString("testString"); 
       System.out.println("testString="+menuObject); 

       String menuObject1 = jObject.getString("success"); 
       System.out.println("success="+menuObject1); 

       String menuObject2 = jObject.getString("reason"); 
       System.out.println("reason="+menuObject2); 

       String menuObject3 = jObject.getString("data"); 
       System.out.println("data="+menuObject3); 

       JSONObject popupObject = jObject.getJSONObject("data"); 

       JSONArray jObject1 = popupObject.getJSONArray("networks"); 
       for (int i = 0; i < 2; i++) { 
        System.out.println("networkId of"+" "+i+" th element= "+jObject1.getJSONObject(i).getString("networkId").toString()); 
        System.out.println("networkName of"+" "+i+" th element= "+jObject1.getJSONObject(i).getString("networkName").toString()); 
        System.out.println("networkType of"+" "+i+" th element= "+jObject1.getJSONObject(i).getString("networkType").toString()); 

       } 
+0

谢谢,这两个答案给了我如何实施解决方案的想法。 – Brian 2011-06-01 06:19:48