我如何在C#中反序列化一个Json对象,其中该对象包含一个Union字段?

时间:2018-10-23 22:46:06

标签: c# json asp.net-web-api2

我正在尝试使用C#为Google助手参数对象(https://developers.google.com/actions/reference/rest/Shared.Types/Argument)创建数据模型。这是Google在链接中提供的文档的摘录。这是他们发布到我的API的Json对象的格式。

{
  "name": string,
  "rawText": string,
  "textValue": string,
  "status": {
    object(Status)
  },

  // Union field value can be only one of the following:
  "intValue": string,
  "floatValue": number,
  "boolValue": boolean,
  "datetimeValue": {
    object(DateTime)
  },
  "placeValue": {
    object(Location)
  },
  "extension": {
    "@type": string,
    field1: ...,
    ...
  },
  "structuredValue": {
    object
  }
  // End of list of possible types for union field value.
}

“ //联合字段值只能是以下之一”之后,我感到困惑。如果我不知道Google将向我发送什么对象,我不知道如何将对象反序列化为我的数据模型。

我尝试列出模型中所有可能的类型

 public class Argument
    {
        [JsonProperty("name")]
        public string Name { get; set; }

        [JsonProperty("rawText")]
        public string RawText { get; set; }

        [JsonProperty("textValue")]
        public string TextValue { get; set; }

        [JsonProperty("status")]
        public Status Status { get; set; }

        [JsonProperty("intValue")]
        public int IntValue { get; set; }

        [JsonProperty("floatValue")]
        public float FloatValue { get; set; }

        [JsonProperty("boolValue")]
        public bool BoolValue { get; set; }

        [JsonProperty("datetimeValue")]
        public GoogleDateTime DateTimeValue { get; set; }

        [JsonProperty("placeValue")]
        public Location PlaceValue { get; set; }

        [JsonProperty("extensions")]
        public KeyValuePair<string, string> Extensions { get; set; }

        [JsonProperty("structuredValue")]
        public JObject StructuredValue { get; set; }

    }

这是Google发布到我的Web API的Json的参数部分

"arguments": [
        {
          "name": "trigger_query",
          "rawText": "what's happening today",
          "textValue": "what's happening today"
        },
        {
          "name": "DATEFIELD",
          "rawText": "today",
          "textValue": "today",
          "dateValue": {
            "year": 2018,
            "month": 10,
            "day": 23
          }
        }
      ]

在这种特殊情况下,Google应该向我发送日期。当我查看上方的原始Json时,Google并未在dateTimeValue中发送日期,如文档所示,它向我发送了dateValue。当我为模型添加dateValue属性时,它可以工作,但是似乎与文档不匹配。当只需要一个值时,拥有所有不同类型的值似乎不是正确的代码。设计数据模型的最佳方法是什么?

0 个答案:

没有答案