【问题标题】:I am facing problem in deserializing my json我在反序列化我的 json 时遇到问题
【发布时间】:2021-10-19 16:17:50
【问题描述】:

每次我尝试将我的 Json 转换为 POJO 时都会收到此错误

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: 预期 BEGIN_OBJECT 但在第 1 行第 371 列路径 $.x-business-use-case-usage[0] 处为 STRING 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:226) 在 com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41) 在 com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82) 在 com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222) 在 com.google.gson.Gson.fromJson(Gson.java:932) 在 com.google.gson.Gso

我的json文件是

{
  "x-fb-trace-id": [
    "VFJHSFvswhd"
  ],
  "x-fb-request-id": [
    "GVMShgvwjmfmsnvhjgs"
  ],
  "null": [
    "HTTP/1.1 200 OK"
  ],
  "Alt-Svc": [
    "h3-29=\":443\"; ma=3600,h3-27=\":443\"; ma=3600"
  ],
  "Access-Control-Allow-Origin": [
    "*"
  ],
  "x-fb-rlafr": [
    "0"
  ],
  "Connection": [
    "Keep-Alive"
  ],
  "x-fb-rev": [
    "16746598"
  ],
  "Pragma": [
    "no-cache"
  ],
  "Date": [
    "Thu, 29 Jul 2019 13:41:17 GMT"
  ],
  "x-business-use-case-usage": [
    "{\"692950841314120\":[{\"type\":\"ads_management\",\"call_count\":3,\"total_cputime\":1,\"total_time\":5,\"estimated_time_to_regain_access\":0}]}"
  ],
  "Strict-Transport-Security": [
    "dbjkabjbfbkvj"
  ],
  "Cache-Control": [
    "private, no-cache, no-store, must-revalidate"
  ],
  "Vary": [
    "Origin"
  ],
  "Expires": [
    "wkdfbvdksjwfbkjfkdb"
  ],
  "Content-Length": [
    "104"
  ],
  "X-FB-Debug": [
    "hdljwbejkfbkwejbkwjebkwjbfkwjfbejkfeifhwjkfbwejkfwbkjfebkf"
  ],
  "facebook-api-version": [
    "v10.0"
  ],
  "Content-Type": [
    "application/json; charset=UTF-8"
  ]
}

而我的 POJO 结构是

@NoArgsConstructor
@AllArgsConstructor
@ToString
@Getter
@Setter
public class JsonClass {
    @SerializedName("x-business-use-case-usage")
    private List<UseCase> businessUseCase;
    

}

@NoArgsConstructor
@AllArgsConstructor
@ToString
@Getter
@Setter
public class UseCase {
    @SerializedName("692950841314120")
    private List<Case> c;
    
}

@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class Case {
    @SerializedName("type")
    private String type;
    @SerializedName("call_count")
    private Integer callCount;
    @SerializedName("total_cputime")
    private Integer totalCputime;
    @SerializedName("total_time")
    private Integer totalTime;
    @SerializedName("estimated_time_to_regain_access")
    private Integer estimatedTimeToRegainAccess;
}

我尝试使用此代码,但在尝试使用 gson 转换 POJO 中的 json 的最后一行出现错误。

@SuppressWarnings("deprecation")
        JsonParser parser = new JsonParser();
        Object obj = parser.parse(new FileReader("res.json"));
        JsonObject s = (JsonObject)obj;
        Gson gson = new Gson();
        JsonClass header = (JsonClass) gson.fromJson(s.toString(), JsonClass.class);

【问题讨论】:

  • 为什么要使用 Json 解析器读取文件,然后将生成的 JsonObject 转换为字符串,并使用 Gson 进行解析?
  • 另外,问题是List&lt;UseCase&gt; businessUseCase。在 Json 中,这实际上是 String 而不是列表,因此会出现错误。
  • 我知道有更简单的方法,但是这段代码是在我试图让它工作时编写的:)
  • 那么,没有任何字符串操作就不能直接转换成 POJO 吗?

标签: java json gson deserialization pojo


【解决方案1】:
 "x-business-use-case-usage": [
    "{\"692950841314120\":[{\"type\":\"ads_management\",\"call_count\":3,\"total_cputime\":1,\"total_time\":5,\"estimated_time_to_regain_access\":0}]}"
  ],

在这里,如您所见,x-business-use-case-usage 是一个带有 1 个元素的 string[] - 它恰好是另一个编码、转义的 json 字符串。

您的 pojo,希望它是 List&lt;UseCase&gt;,因此它将无法正常工作,因为实际的 json 将映射到 List&lt;String&gt;

这就是错误所说的,该对象是预期的(实际上是{),但给出了string。您必须将其解析为字符串,然后将其再次解析为UseCase

要使其在单次运行中工作,您可以尝试编写自定义反序列化程序,该反序列化程序将删除转义然后解析嵌套的 json。请参阅 GSON 文档了解如何制作自定义反序列化器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 2020-10-20
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多