Android - Retrofit Gson - 如何将 JSON 字符串解析为 JSON 响应中 JSON 键的对象?

标签 android json gson retrofit2

这是我的 JSON 响应:

{
      "id": 2,
      "name": "Test",
      "content": "{\"type\": \"status\", \"text\": \"Lorem ipsum dummy text.\", \"id\": 1}"
}

这些是模型结构:

class TestModel {
    public int id;
    public String name;
    public Content content;
}

class Content {
    public int id;
    public String status;
    public String text;
}

我想使用 Retrofit 和 GsonConvertor 将内容的值直接解析到我的内容模型对象中。但目前,我将其解析为字符串值,而不是使用 Gson.fromJson() 转换为我的内容模型对象。有什么解决方案可以达到我的预期结果吗?

当我以前使用 GsonConverterFactory 解析它时,Retrofit 在 onFailure 方法中给出了回调,但有这个异常:

java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 4 column 19 path $.data[0].content

最佳答案

问题出在 JSON 响应上,它不在 correct JSON format 中. "content" 字段应该是一个对象,而不是字符串:

{
    "id": 2,
    "name": "Test",
    "content": {
        "type": "status",
        "text": "Lorem ipsum dummy text.",
        "id": 1
    }
}

这将允许 gson.fromJson(response, TestModel.class) 或带有 GsonConverterFactoryRetroFit 将您的响应正确解析为相应的对象。


当然,这仅适用于您能够更改收到的 JSON 响应的情况。如果不是,请首先确保控制响应的人知道他们做的。如果没有任何变化,那么您应该能够通过将 TestModel 中的 content 更改为 String 来解决此问题:

class TestModel {
    public int id;
    public String name;
    public String content;
}

class Content {
    public int id;
    public String type;
    public String text;
}

然后分别解析每个对象:

TestModel testModel = gson.fromJson(response, TestModel.class);
Content content = gson.fromJson(testModel.content, Content.class);

如果无法更改响应,另一种选择是创建一个 TypeAdapter对于您的 Content 对象:

public class ContentAdapter extends TypeAdapter<Content> {

    @Override
    public void write(JsonWriter out, Content value) throws IOException {
        // TODO: Writer implementation
    }

    @Override
    public Content read(JsonReader in) throws IOException {
        if(in.peek() != JsonToken.NULL) {
            return fromJson(in.nextString());
        } else {
            in.nextNull();
            return null;
        }
    }

}

然后将 TypeAdapter 添加到您的 GSON 实现中:

Gson gson = new GsonBuilder()
        .registerTypeAdapter(Content.class, new ContentAdapter()).create();

关于Android - Retrofit Gson - 如何将 JSON 字符串解析为 JSON 响应中 JSON 键的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39342998/

相关文章:

java - 将 Google Guava 添加到 Android 项目 - 显着减慢构建速度

android - openCV Android 相机方向

android - WebView 嵌套滚动在 Android Jetpack Compose 中不起作用

javascript - 在 Angular 中编辑 JSON 搜索结果

java - 如何使用GSON解析变量名JSON对象?

java - 阅读 Fortnite Json API

android - 解决 Android/Java Pattern/Matcher Regex 超长字符串限制

json - React安装错误怎么办

java - Spring 4,JSON - HTTP 错误 406 Not Acceptable

Android Retrofit 2 多个转换器(Gson & SimpleXML)错误