【问题标题】:Json parse error on what looks to be good string (Expected BEGIN_OBJECT but was BOOLEAN)看起来不错的字符串的 Json 解析错误(预期为 BEGIN_OBJECT 但为 BOOLEAN)
【发布时间】:2018-07-19 19:09:32
【问题描述】:

所以,我们在 java 中工作,被反序列化的对象的结构是这样的

@ApiModel(description = "Container for collection of Patient Search results")
public class PatientSearchResultListCMRefactor {

private final List<PatientSearchResultCMRefactor> patientSearchResults;
private final int totalSearchResults;
//getters, toString, etc
}

该对象中引用的对象如下

public final class PatientSearchResultCMRefactor {

private float score;

private String id;
private String firstName;
private String lastName;
private String setupDate;

private Optional<AddressCM> address;
private Optional<Boolean> active;
private Optional<String> dateOfBirth;
private Optional<String> email;
private Optional<String> patientExternalId;
private Optional<String> patientReference;
private Optional<String> phoneNumber;
private Optional<String> currentAverageDaysUsed;
private Optional<Double> currentAverageHoursUsed;

private Optional<PatientOrganizationCM> organization;
private Optional<PatientOrganizationCM> topOrganization;

private Optional<ImmutableSet<PatientClinicianCM>> clinicians;

private Optional<ImmutableSet<PatientLocationCMRefactor>> locations;

private Optional<ImmutableSet<PatientDeviceCM>> devices;

private Optional<String> matchesBy;
//setters, getters, left-handed smoke-shifters, constructors 

}

反序列化的代码是

Gson gson = new Gson();
System.out.println(response.getBody());
String jsonTemp = response.getBody();
System.out.println(jsonTemp);
PatientSearchResultListCMRefactor resultListCM = gson.fromJson(jsonTemp, PatientSearchResultListCMRefactor.class);

被反序列化的完整字符串是

{
  "patientSearchResults": [
    {
      "score": 0.7582117,
      "id": "3910dc3d-913b-4862-aee5-4610d2c2981f",
      "firstName": "Nelda",
      "lastName": "Dixon 36",
      "setupDate": "2018-07-19",
      "address": {
        "streetAddress": "0545 Route 202",
        "city": "Joliet",
        "stateProvince": "SC",
        "zipCode": "87636",
        "countryCode": "USA"
      },
      "active": true,
      "dateOfBirth": "1971-01-16",
      "email": "n_dixon_RRAwyqXKIp@example.com",
      "patientExternalId": "6bc63dfa-1106-40c9-875a-a74368cf5189",
      "patientReference": null,
      "phoneNumber": "365-177-2753",
      "currentAverageDaysUsed": null,
      "currentAverageHoursUsed": null,
      "organization": null,
      "topOrganization": null,
      "clinicians": [

      ],
      "locations": null,
      "devices": [

      ],
      "matchesBy": null
    }
],
  "totalSearchResults": 17
}

错误是

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BOOLEAN at line 1 column 289

紧接在

之后
"address": {
    "streetAddress": "0545 Route 202",
    "city": "Joliet",
    "stateProvince": "SC",
    "zipCode": "87636",
    "countryCode": "USA"
  },
  "active": true,

在字符串中,“true”之后的逗号是第 289 列(为了澄清,行号和列号来自我对字符串进行漂亮打印之前)。我认为它需要一个新对象,但地址是嵌套在顶部对象中的子对象,并且子对象的深度永远不会超过 1 级,尽管根据 PatientSearchResultCMRefactor 模型有多个子对象。我是一名测试人员,这是一个 ReST API 调用的主体,所以我不能真正改变响应的格式。我所能做的就是尝试按原样解析它。有什么建议吗?

【问题讨论】:

  • "patientSearchResults": [
  • @dhke 你是对的,谢谢。不幸的是,这只是一个转录错误,我已经更正了。
  • 您是否检查过AddressCM 的定义是否正确?
  • @JoakimDanielson 是的,我检查了 PatientSearchResultCMRefactor 中引用的所有对象的正确性。使用适当的 setter 和 getter 计算所有变量。
  • 我能想到的只有一件事:setActive 参数定义为boolean 还是java.lang.Boolean

标签: java json gson deserialization


【解决方案1】:

更新:事实证明,gson 在可选变量和不可变集方面确实存在问题。一旦我将 PatientResultCMRefactor 更改为

public final class PatientSearchResultCMRefactor {

private float score;

private String id;
private String firstName;
private String lastName;
private String setupDate;

private AddressCM address;
private Boolean active;
private String dateOfBirth;
private String email;
private String patientExternalId;
private String patientReference;
private String phoneNumber;
private String currentAverageDaysUsed;
private Double currentAverageHoursUsed;

private PatientOrganizationCM organization;
private PatientOrganizationCM topOrganization;

private Set<PatientClinicianCM> clinicians;

private Set<PatientLocationCMRefactor> locations;

private Set<PatientDeviceCM> devices;

private String matchesBy;
//getters, setters, etceterrers
}

一切都完美反序列化。将此作为答案发布,而不是更新问题,以便其他人将来更容易找到。

【讨论】:

    猜你喜欢
    • 2015-11-10
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 2018-04-21
    • 2020-07-26
    • 2016-08-28
    • 1970-01-01
    相关资源
    最近更新 更多