简体   繁体   English

如何正确使用 GSON 解析此 json 字符串。 JsonObject 返回空且没有解析错误

[英]How do I parse this json string using GSON correctly. JsonObject is returning empty with no parse errors

I have a data structure as follows我有一个数据结构如下

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

So basically it's an array object with the first thee key/value pairs being a 1)String 2)Bool 3)String and the fourth is a JSONObject所以基本上它是一个数组 object,第一个键/值对是 1)String 2)Bool 3)String,第四个是 JSONObject

The Object i'm using as a container for all this data is我用作所有这些数据的容器的 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;
}
}

I parse it like this withr esponse object being the json string我像这样解析它,响应 object 是 json 字符串

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

I can get values for everything except the JSONObject it always returns an empty array like {} Any thoughts on where I'm messing up?我可以获取除 JSONObject 之外的所有内容的值,它总是返回一个空数组,如 {} 关于我搞砸的地方有什么想法吗?

Here's an approach that works with the JSON input you provided, but more "fully" deserializes into a friendly data structure.这是一种适用于您提供的 JSON 输入的方法,但更“完全”反序列化为友好的数据结构。

The output is output 是

[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);
  }
}

I have parsed the JSON string you have mentioned above.我已经解析了您上面提到的 JSON 字符串。 It is not using the GSON to parse the JSON.它没有使用 GSON 来解析 JSON。 Please try this also.请也试试这个。 I think it will sove your issue:我认为它将解决您的问题:

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

                }

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

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