Как определить переменную в классе, чтобы получить либо List <string>, либо строку при десериализации JSON? - PullRequest
0 голосов
/ 09 ноября 2018

Есть ли способ объявить класс, в котором для конкретной переменной я могу получить список или строку?

Я пытаюсь десериализовать JSON, и он может прийти в одном из следующих форматов:

"MercadoriasPresencaCarga": {
  "Mercadoria": 7693066,
  "Descarga": "08/07/2017 13:35:39"
},

или

 "MercadoriasPresencaCarga": {
  "Mercadoria": [
    "7693066"
  ],
  "Descarga": [
    "08/07/2017 13:35:39"
  ]
},

Класс для этого блока создается так:

public class MercadoriasPresencaCarga
{
    public List<string> Mercadoria { get; set; }

    public List<string> Descarga { get; set; }
}

Проблема в том, что если этот блок JSON будет первым форматом, который я показал, где он не является массивом, это приведет к ошибке десериализации.

Как я мог решить эту проблему?

1 Ответ

0 голосов
/ 09 ноября 2018

В идеале json всегда должен быть в одном и том же формате, но если это невозможно, есть некоторые обходные пути.

Обе строки json будут успешно десериализованы с использованием следующего класса:

public class Model
{
    // other properties here 
    // ....

    [JsonIgnore]
    public string Mercadoria => GetValue("Mercadoria");

    [JsonIgnore]
    public string Descarga => GetValue("Descarga");

    public JObject MercadoriasPresencaCarga { get; set; }


    private string GetValue(string path)
    {
        if (MercadoriasPresencaCarga == null)
        {
            return null;
        }

        string value = null;
        JToken token = MercadoriasPresencaCarga.SelectToken(path);

        if (token.Type == JTokenType.Array && token.HasValues)
        {
            value = token.First.Value<string>();
        }
        else
        {
            value = token.Value<string>();
        }

        return value;
    }
}

Обратите внимание, что:

  • MercadoriasPresencaCarga будет десериализовано как JObject
  • И Mercadoria, и Descarga являются несериализуемыми свойствами (отмечены [JsonIgnore])

Тестирование кода - строка json со свойствами строки (без массивов):

string json1 = @"{
    ""MercadoriasPresencaCarga"": {
      ""Mercadoria"": 7693066,
      ""Descarga"": ""08/07/2017 13:35:39""
    }
}";

Model model1 = JsonConvert.DeserializeObject<Model>(json1);

Console.WriteLine($"Descarga: {model1.Descarga}, Mercadoria: {model1.Mercadoria}");

Тестирование кода - строка json с массивами:

string json2 = @"{
    ""MercadoriasPresencaCarga"": {
      ""Mercadoria"": [
        ""7693066""
      ],
      ""Descarga"": [
        ""08/07/2017 13:35:39""
      ]
    }
}";

Model model2 = JsonConvert.DeserializeObject<Model>(json2);

Console.WriteLine($"Descarga: {model2.Descarga}, Mercadoria: {model2.Mercadoria}");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...