【问题标题】:How let the Json.net return a new T value when the Deserialize Object is null?Deserialize Object为null时,如何让Json.net返回一个新的T值?
【发布时间】:2015-02-22 10:43:52
【问题描述】:

当我使用 Json.net 时,我总是遇到这样的问题:

 List<Person> persons = JsonConvert.DeserializeObject<List<Person>>(personsJson);

你们知道:有的时候因为服务器错误或者其他什么问题,返回的json字符串只是一个null值

但是当 personsJsonnull 值时。 Json.net 将抛出:System.ArgumentNullException

我只需要它自动给我一个新的源对象,我的意思是当personJson为null时,给我回:new List of Person();这样会更有帮助,我不需要在逐个descrialize之前确定每个json字符串。

我认为可能有一些设置可以做到这一点,但没有找到。

【问题讨论】:

    标签: c# .net json.net


    【解决方案1】:

    那么为什么不只检查 null 呢?

    List<Person> persons = personsJson != null 
                            ? JsonConvert.DeserializeObject<List<Person>>(personsJson)
                            : new List<Person>();
    

    如果你有太多这样的代码,你可以概括一下:

    public static T Deserialize<T>(this string json) where T : new()
    {
         return json != null 
                        ? JsonConvert.DeserializeObject<T>(json)
                        : new T();
    }
    
    
    List<Person> persons = personsJson.Deserialize<List<Person>>();
    

    【讨论】:

    • 使用扩展方法是个好主意。现在这是一个安全的描述。谢谢。
    【解决方案2】:

    您可以在尝试反序列化之前测试变量:

    public List<Person> DeserializePersons(string personsJson)
    {
        if (string.IsNullOrEmpty(personsJson))
        {
            return new List<Person>();
        }
        else
        {
            return JsonConvert.DeserializeObject<List<Person>>(personsJson);
        }
    }
    

    但是,您可能希望处理与“检索人员时发生错误”不同的“未找到人员”情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多