空的json列表被视为null

时间:2019-05-15 12:25:11

标签: c# json asp.net-mvc

我有一个空的JSON列表反序列化为null而空值反序列化为一个空列表的问题。

在全新的MVC项目中使用此测试方案:

public class TestController : Controller
{
   public ActionResult Index(ImportObject importObject)
   {
      return Content("Response");
   }

   public class ImportObject
   {
      public List<string> StringListNull { get; set; }
      public List<string> StringListEmpty { get; set; }
      public List<string> StringListPopulated { get; set; }
   }
}

我要发布以下JSON:

{
  "StringListNull": null,
  "StringListEmpty": [],
  "StringListPopulated": ["one", "two"]
}

这会发生:

Debugging result

预期填充的字符串列表。但我认为StringListNull的null值应导致它为null。

传递值[]时,我希望它会变成一个空列表

我错过了一些琐碎的事情吗?如何使null值成为空列表,而使空列表成为空列表?

什么控制从JSON到参数类(ImportObject)的默认序列化?

/ K

2 个答案:

答案 0 :(得分:1)

我尝试了您的代码,并且运行正常,可能是您在切换StringListNull和StringListEmpty。

enter image description here

这是我进行测试的方式,尝试一下,看看您在哪里做错了事:

public class ImportObject
{
    public List<string> StringListNull { get; set; }
    public List<string> StringListEmpty { get; set; }
    public List<string> StringListPopulated { get; set; }
}


class Program
{
    static void Main(string[] args)
    {
        var sb = new StringBuilder();
        var line = string.Empty;

        while (!string.IsNullOrWhiteSpace((line = Console.ReadLine())))
        {
            sb.AppendLine(line);
        }

        var json = sb.ToString().Trim();
        var inputObj = JsonConvert.DeserializeObject<ImportObject>(json);

        Console.WriteLine();
    }
}

这是一个简单的控制台应用程序,用于测试您的逻辑。 编辑: 使用您的输入JSON进行了测试:

{
  "StringListNull": null,
  "StringListEmpty": [],
  "StringListPopulated": ["one", "two"]
}

答案 1 :(得分:0)

那么,您可以使用Newtonsoft.Json或Json.NET对Json进行序列化或反序列化。它将为您提供所需的结果。

这是我尝试过的代码:

static void Convert()
{
    string K = @"{ ""StringListNull"": null, ""StringListEmpty"": [], ""StringListPopulated"": [""one"", ""two""]}";
    var list= JsonConvert.DeserializeObject<ImportObject>(K);
}

public class ImportObject
{
    public List<string> StringListNull { get; set; }
    public List<string> StringListEmpty { get; set; }
    public List<string> StringListPopulated { get; set; }
}

列表中的对象正是您想要的。