引起:java.lang.IllegalStateException:期望一个字符串但是BEGIN_OBJECT

时间:2016-12-30 08:36:33

标签: java android json gson

我正在使用Gson来解析像这样的JSON字符串:

{"showapi_res_code": 0,
  "showapi_res_error": "1",
  "showapi_res_body": {
    "totalNum": 44,
    "ret_code": 0
   }
 }

当我使用以下代码时,一切正常:

Bean bean = gson.fromJson(stringFromSource, Bean.class);

public class Bean{
    int showapi_res_code;
    String showapi_res_error;
    Body showapi_res_body;

    public static class Body{
        int totalNum;
        int ret_code;
    }
}

但是当我使用下面的代码时,事情并不常用:

Bean1 bean1 = gson.fromJson(stringFromSource, Bean1.class);

public class Bean1 {
    int showapi_res_code;
    String showapi_res_error;
    String showapi_res_body;
}

我得到了这个例外:

  

引起:java.lang.IllegalStateException:期望一个字符串,但在第3行第24行路径$ BshIN_OBJECT $ .showapi_res_body

如何使用Gson完成这项工作?

3 个答案:

答案 0 :(得分:1)

添加单独的类而不是内部类

public class Bean{
    int showapi_res_code;
    String showapi_res_error;
    Body showapi_res_body;
} 

public class Body{
        int totalNum;
        int ret_code;
    }

或者

public class Bean{
        int showapi_res_code;
String showapi_res_error;
HashMap<String,Integer> showapi_res_body;

public int getShowapi_res_code() {
    return showapi_res_code;
}

public void setShowapi_res_code(int showapi_res_code) {
    this.showapi_res_code = showapi_res_code;
}

public String getShowapi_res_error() {
    return showapi_res_error;
}

public void setShowapi_res_error(String showapi_res_error) {
    this.showapi_res_error = showapi_res_error;
}

public HashMap<String, Integer> getShowapi_res_body() {
    return showapi_res_body;
}

public void setShowapi_res_body(HashMap<String, Integer> showapi_res_body) {
    this.showapi_res_body = showapi_res_body;
}
} 

获取详细信息

Bean bean1 = gson.fromJson(stringFromSource, Bean1.class);
int totalNum = (Integer)bean1.getShowapi_res_body().get("totalNum");
int ret_code= (Integer)bean1.getShowapi_res_body().get("ret_code");

答案 1 :(得分:0)

showapi_res_body不是String值。在上一个示例中,您使用的是Body对象,我建议您使用相同的对象。如果您想输出String,请尝试手动执行:

public static class Body { 

    int totalNum;
    int ret_code; 

    @Override
    public String toString() {
        return "totalNum = " + totalNum + ", ret_code = " + ret_code;
    }
}

然后你可以打电话:

String output = bean1.showapi_res_body.toString();

答案 2 :(得分:0)

嗯,我猜这很明显,如果你想让它成为String,你的JSON应该把字段作为String类型。

{"showapi_res_code": 0,
  "showapi_res_error": "1",
  "showapi_res_body": "{ \"totalNum\": 44, \"ret_code\": 0}"
 }