反序列化JSON时如何在类中定义变量以接收List <string>或string?

时间:2018-11-09 11:55:09

标签: c# entity-framework json-deserialization

有没有一种方法可以声明一个类,对于一个特定的变量,我可以接收一个列表或一个字符串?

我试图反序列化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 :(得分:3)

理想情况下,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
  • MercadoriaDescarga都是不可序列化的属性(标记为[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}");