【问题标题】:JSON standards - and polymorphismJSON 标准 - 和多态性
【发布时间】:2019-03-06 18:52:46
【问题描述】:

我们主要是JavaSpring/Hibernate 等一起购物。我们有基于RESTAPI 供我们的客户使用,这些客户可能会或可能不会使用Java

我们的客户面临的一个问题是由于多态性而将对象转换为具体类型。

如果我们所有的客户都使用Java/Spring,我可以修改对象映射器的设置以返回有关类型的信息。一个这样的例子可以在baeldung and polymorphism找到。

我不清楚嵌入生成的JSON 的类型信息是否被其他JSON 解析器在Python/Node-Javascript/.NET 等中说是有效的JSON会破坏他们的代码。

对于嵌入在JSON 中的类型信息,是否有任何标准,就像Jackson 那样。谷歌搜索没有透露太多信息。

【问题讨论】:

  • @MichałZiober,它没什么用,我投了赞成票,但没有接受它,因为我希望得到更多答案
  • 你是怎么解决这个问题的?我只是好奇。
  • @MichałZiober,不是真的,我最终使用 JsonTypeInfo.Id.CLASS 作为快速修复。看文档,我觉得Id.NAME可以用得更优雅一些,但是没有机会去玩。

标签: python .net json jackson polymorphism


【解决方案1】:

没有一个标准是所有框架都必须遵循的。甚至Jackson 也可以通过多种不同的方式来实现这一点,无论用户决定使用什么方式。同样Jackson 总是生成valid JSON,即使使用了整个类名,例如"org.baeldung.jackson.inheritance.Car""org.baeldung.jackson.inheritance.Truck"。为了使其工作和易于使用,您必须澄清所有base typessubtypes

  • 文档
  • JSon Schema

发送整个class 名称是没有意义的,因为非Java 客户端无论如何都不会自动识别它们。所以,你需要创建映射:

  • BP - 基础产品
  • P1 - 产品 1
  • P2 - 产品 2
  • ...

您还可以指定,例如,每个对象都包含"type" 属性,该属性将设置为上述列表中的一个:

[
   {
      "type":"P1",
      "model":"S500",
      "cost":250.0
   },
   {
      "type":"P2",
      "model":"NQR",
      "capacity":7500.0
   }
]

以上内容应为deserialise任何payload提供足够的信息。

【讨论】:

    猜你喜欢
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    • 2021-12-01
    • 1970-01-01
    相关资源
    最近更新 更多