Как десериализовать объект Json в C #, где объект содержит поле Union? - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь создать модель данных в C # для объекта аргумента помощника Google (https://developers.google.com/actions/reference/rest/Shared.Types/Argument) Вот фрагмент документации, которую Google предоставляет по ссылке. Это формат объекта Json, который они публикуютв мой API.

{
  "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; }

    }

Вот раздел аргументов Json Google:публикация в моем веб-интерфейсе API

"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 к моей модели, оно работает, но это не похоже на документацию. Это не похоже на правильный и чистый код дляиметь все различные типы значений, когда требуется только одно.Как лучше всего спроектировать модель данных

...