【问题标题】:Exception while converting json string to java object by GsonGson将json字符串转换为java对象时出现异常
【发布时间】:2016-11-26 12:32:54
【问题描述】:

我正在使用 Gson lib 将 json 反序列化为 Java 对象,但出现错误。
下面是json字符串:

{ "pageInfo": [ { "detail": "{\"key1\":\"value1\",\"key2\":\"value2\"}", "id": 4, "type": 0 }] }

还有java类:

public java.util.List pageInfo; class CreditDetailItem { public String id; public int type; public String detail; }

然后抛出异常:预期为 BEGIN_OBJECT 但在“详细信息”属性上为 STRING

有没有人可以帮帮我?

【问题讨论】:

  • 添加您尝试将 JSON 转换为 Java 对象的代码。
  • detail 不应该是另一个对象吗?可能 Gson 足够聪明,可以注意到您有一个编码为字符串的对象。
  • 尝试不带引号和斜线.. {"key1":"value1","key2":"value2"} .
  • 我认为您的代码中写入的 JSON 字符串存在问题,请查看 readyandroid 答案。

标签: java android json gson


【解决方案1】:

是的,JSON 与 Java 代码不匹配。这是在 JAVA 中推荐的方法。

class JSONWrapper {
    java.util.List<PageInfo> pageInfo = new java.util.ArrayList<PageInfo>();

    public void setPageInfo(java.util.List<PageInfo> pageInfo) {
        this.pageInfo = pageInfo;
    }
    public java.util.List<PageInfo> getPageInfo() {
        return pageInfo;
    }
}

class PageInfo {
    String id;
    int type;
    String detail;

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public int getType() {
        return type;
    }
    public void setType(int type) {
        this.type = type;
    }
    public String getDetail() {
        return detail;
    }
    public void setDetail(String detail) {
        this.detail = detail;
    }
}

【讨论】:

    【解决方案2】:

    假设这是您格式化的 JSON 数据。

    {
        "pageInfo": [
          {
            "detail": {
                    "key1": "value1",
                    "key2": "value2"
                },
            "id": 4,
            "type": 0
          }]
    }
    

    试试这个POJO类,

    public class ParsedData {
    
        List<CreditDetailItem> pageInfo = new ArrayList<CreditDetailItem>();
    
        class CreditDetailItem {
            public String id;
            public int type;
            public Detail detail;
    
            //getters and setters
        }
    
        public class Detail {
            public String key1;
            public String key2;
    
            //getters and setters
        }
    
    }
    

    解析JSON

    ParsedData parsedData = new Gson().fromJson(jsonString, ParsedData.class);
    

    【讨论】:

      【解决方案3】:

      检查一下它对我有用。

      如果 build.gradle 不存在,则添加依赖项:

      compile("com.google.code.gson:gson:2.8.0")
      

      这是你的 JSONObject:

      {
          "pageInfo": [
            {
              "detail": "{\"key1\":\"value1\",\"key2\":\"value2\"}",
              "id": 4,
              "type": 0
            }
          ]
      }
      

      这是你的页面信息列表模型类:

      public class MyModelList {
      
          public List<MyModel> pageInfo = new ArrayList();
      }
      

      这是为您的页面信息列表项模型类:

      public class MyModel {
          public String id;
          public int type;
          public String detail;
      }
      

      这是您可以检查 gson 到 json 以及单个项目或列表模型的副版本转换的方法:

      private void myGson() {
              GsonBuilder gsonBuilder = new GsonBuilder();
              Gson gson = gsonBuilder.create();
      
              //Convert to java objects
              MyModel mModel = gson.fromJson("{\n" +
                              "            \"detail\": \"{\\\"key1\\\":\\\"value1\\\",\\\"key2\\\":\\\"value2\\\"}\",\n" +
                              "            \"id\": 4,\n" +
                              "            \"type\": 0\n" +
                              "          }"
                      , MyModel.class);
      
              MyModelList mModelList = gson.fromJson("{\n" +
                              "        \"pageInfo\": [\n" +
                              "          {\n" +
                              "            \"detail\": \"{\\\"key1\\\":\\\"value1\\\",\\\"key2\\\":\\\"value2\\\"}\",\n" +
                              "            \"id\": 4,\n" +
                              "            \"type\": 0\n" +
                              "          }" +
                              "]\n" +
                              "    }"
                      , MyModelList.class);
              Log.e("TAG", mModel.toString());
              Log.e("TAG", mModelList.toString());
      
              //Convert to JSON
              String sModelList = gson.toJson(mModelList);
              String sModel = gson.toJson(mModel);
          }
      

      【讨论】:

        【解决方案4】:

        公共类 CreditDetailItem {

        @SerializedName("pageInfo")
        @暴露
        公共列表 pageInfo = new ArrayList();


        公共类 PageInfo {

        @SerializedName("详细信息")
        @暴露
        公共字符串详细信息;

        @SerializedName("id")
        @暴露
        公共整数 id;

        @SerializedName("类型")
        @暴露
        公共整数类型;
        }

        }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-04
          • 2013-05-19
          • 1970-01-01
          • 1970-01-01
          • 2017-01-24
          • 1970-01-01
          • 2018-01-20
          • 1970-01-01
          相关资源
          最近更新 更多