【问题标题】:How to specify subclass types in JSON (in a REST web service)如何在 JSON 中指定子类类型(在 REST Web 服务中)
【发布时间】:2014-03-05 03:28:47
【问题描述】:

我有一个 .NET REST Web 服务,可以将 JSON 数据发送到各种移动应用程序。

我正在测试一个新方法,它返回的对象可能是几个子类之一,例如在下面的伪代码中它可以返回:

wallet: {
  cards: [ { name: 'mastercard', ...},
           { name: 'visacard', ...},
           { name: 'photocard', ...}
  ]
}

其中每张卡片都是卡片的子类,例如

public abstract class Card
{
  ...
}
public class CreditCard : Card 
{
  ...
}
public class ConcessionCard : Card
{
  ...
}

public string webServiceMethodGetWallet()
{
  myWallet = new Wallet();
  CreditCard visaCard = new CreditCard();
  CreditCard masterCard = new CreditCard();
  ConcessionCard photoCard = new ConcessionCard();
  myWallet.cards.AddAll(visaCard, masterCard, photoCard);
  return JSON.Serialize(myWallet);  
}

我正在多个平台(iOS、Android 和 Windows Phone)上反序列化这些数据。

什么是让客户端应用知道在反序列化时为每个对象使用哪个类的好策略?例如在上面的示例中,客户端应用程序如何在不检查所有字段的情况下判断是创建 CreditCard 还是 ConcessionCard 类型的类?

请记住,我需要在 Objective C、Java 和 .NET 中反序列化。

有没有“正常”的方式来做到这一点?

【问题讨论】:

  • 不能代表 Obj-C 或 Java,但代表 .NET - 如果您使用 Json.Net,您可以在 JSON 中包含 $type 属性(必须是第一个属性) Json.Net 使用它作为反序列化器关于目标类型应该是什么的提示。
  • 谢谢 - 我希望可能有一个跨平台的解决方案,或者一个标准的方法,因为我对 JSON 的经验有点有限。
  • 我也找到了这个。目标-C:stackoverflow.com/questions/14958883/…。我不明白 :) 但它似乎确实根据 json 本身的属性将 json 映射到特定类型。希望对您有所帮助。
  • 这篇文章:programmerbruce.blogspot.ie/2011/05/… 似乎是在 Java 中可以做到的。因此,总的来说,您可能希望客户端以某种方式告诉服务器他们想要什么“格式”的 json,因为这三个示例中的每一个都使用不同的方式来识别类型映射......

标签: c# .net json web-services serialization


【解决方案1】:

如何在 JSON 中将一个集合拆分为单独的数组(强类型)?

像这样:

wallet: {
  CreditCards: [ { name: 'mastercard', ...},
           { name: 'visacard', ...}
  ],
  ConcessionCards: [ { name: 'photocard', ...}
  ]
}

这样,如果任何不存在,反序列化器会将它们保留为空。

【讨论】:

  • 这似乎效率低下,因为你需要为每个子类创建一个数组,然后在每次添加新子类时修改包含对象以添加一个新数组。它也不能很好地处理创建子类的子类的用例。但也许这是唯一有意义的方法。鼓励发表评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-11
  • 1970-01-01
  • 2012-05-10
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
  • 2014-11-23
相关资源
最近更新 更多