【问题标题】:Spring Android client : get request returning more complexe JSON objectsSpring Android 客户端:获取返回更复杂 JSON 对象的请求
【发布时间】:2018-07-06 20:48:33
【问题描述】:

我正在尝试将 Spring for Android 作为客户端添加到移动应用项目中的 Spring 服务器。查看文档(https://docs.spring.io/spring-android/docs/1.0.1.RELEASE/reference/html/rest-template.html)后,我想使用 方法getForObject() 直接创建我将在代码中使用的对象。我在互联网上找到的所有示例都只显示了如何处理每个键的值(字符串、长整数、整数)的更原始类型。从服务器发回的 JSON 对象如下所示:

{
  "id": "MSP-SS-043208",
  "nom": "Inondation-Débit-Niveau",
  "source": "Ministère de la Sécurité publique du Québec",
  "territoire": "Rivière des Mille Îles(043208)",
  "certitude": "Observé",
  "severite": "Mineure",
  "dateDeMiseAJour": "lundi 04 juin 2018",
  "urgence": "Future",
  "description": "Seuil de surveillance atteint",
  "count": 1,
  "geometry": {
      "type": "Point",
      "coordinates": [-73.6387202781213, 45.6928705203507]
  },
  "type": "Suivi des cours d'eau"
}

我的问题是我不知道如何处理 geometry 键,因为它不是原始对象!我怎样才能让 Spring 认识到有一个 JSON 对象作为某个键的属性?那么双精度数组(坐标)呢?

这是我尝试使用的类:

public class Alert {

  private String id;
  private String nom;
  private String source;
  private String territoire;
  private String certitude;
  private String severite;
  private String dateDeMiseAJour;
  private String urgence;
  private String description;
  private int count;
  private ????? geometry;
  private String type;

  ... gettters and setters ...

}

我的问题归结为:我必须如何声明几何属性以确保正确创建对象?

【问题讨论】:

    标签: java android json spring spring-boot


    【解决方案1】:

    您需要创建一个具有一些反序列化逻辑的 Geometry 类,然后将 private Geometry geometry 声明为 Alert 类的成员。

    这种反序列化通常由 Spring“自动”执行(特别是由 jackson 提供的 fasterxml 库)。由于 Geometry 类看起来有一些重要的对象,因此您还需要定义一个 Coordinates 类和“Type”类(或 Enum),它们可以类似地反序列化。

    有时这种方法会创建很多需要大量工作来处理的小类。另一种方法是在Alert 类的构造函数上使用@JsonCreator 注释:

    @JsonCreator
    public Alert(Map<String, Object> params) {...}
    

    然后你可以手动解析Alert json。

    【讨论】:

    • 非常感谢! “类型”的类型将始终是字符串,所以这不是问题。 Spring 是否还会自动将坐标属性转换为 Java 数组? (我认为我们可以在我们的应用程序中管理只使用双数组)。
    • @OlivierL.Applin 我相信 Spring 会将 JSONArray 转换为 List,我不太确定数组(数组不是正确的对象,所以我不确定)。而我所指的TypeGeometry 的内部,但我认为使用String 是可以的。
    • 太棒了!不幸的是,我现在似乎无法向我们的服务器发送请求,所以我无法测试......但如果它正常工作,我会及时通知你:)!再次感谢
    • 我现在可以正确地向我们的服务器发出一些请求,并且一切正常,除了我臭名昭著的几何。 “反序列化逻辑”到底是什么意思? Spring 客户端对我来说是全新的
    • @OlivierL.Applin 通过反序列化逻辑,我只是​​指将原始 JSON 转换为 Java 对象的逻辑。这个逻辑并不总是很复杂,但有时会出现 Java 对象与 JSON 大不相同的情况,即使您可以在两者之间进行转换。
    猜你喜欢
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多