【问题标题】:Json.net ignore null values of child objectsJson.net 忽略子对象的空值
【发布时间】:2017-01-27 01:03:12
【问题描述】:

我是 json.net 的新手,因此我们将不胜感激。

我使用的是 json.net 的 net 2.0 版本,因为我需要将它集成到 Unity3d 引擎中 建议的答案(使用 nullvaluehandling)只是不起作用!我应该认为这是对最旧版本的限制吗?

所以,有一个像这样的对象:

Object ()
{
   ChildObject ChildObject1;
   ChildObject ChildObject2;
}

ChildObject ()
{
   Property1;
   Property2;
}

我希望 json.net 仅序列化所有对象(包括子对象)的非空属性。因此,如果我只实例化 ChildObject1 的 property1 和 ChildObject2 的 property2,则来自 JsonConvert 的字符串将是这样的:

{
  "ChildObject1": 
        {
           "Property1": "10"
        },
  "ChildObject1": 
        {
          "Property2":"20"
        }
}

但默认行为会创建这样的字符串:

{
  "ChildObject1": 
           {
             "Property1": "10", 
             "Property2": "null" 
           },
  "ChildObject2": 
           {
             "Property1": "null, 
             "Property2":"20"
           }
}

我知道 NullValueHandling,但在我的情况下它不能正常工作!它只忽略父对象(我们正在序列化的对象)的空属性,但是如果这个父对象有一些子对象,它不会忽略这个子对象的空属性。我的情况不同。

如果子对象的一个​​属性不为空,它会将其序列化为一个字符串,其中一个非空属性,其他为空。


我的代码的UPD示例:

我有嵌套类

我的对象是这样的:

public class SendedMessage
{
    public List<Answer> Answers { get; set; }
    public AnswerItem Etalon {get; set;}
}

public class Answer () 
{
public AnswerItem Item { get; set; }
}

   public class AnswerItem () 
   {
   public string ID { get; set; }
   public bool Result { get; set; }
   public int Number { get; set; }
   }

我像这样实例化一个 SendedMessage 对象:

new SendedMessage x;
x.Etalon = new AnswerItem();
x.Etalon.Result = true;

比我用的

string ignored = JsonConvert.SerializeObject(x,
          Formatting.Indented,
          new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });

它使这个字符串:

{ "标准具": {"ID" = "null", "Result" = "false", Number" = "null"}}

所以它确实忽略了 null 对象 Answers(一个 List),但不要忽略子对象的 null 属性。

感谢您的帮助!

【问题讨论】:

标签: c# json serialization json.net


【解决方案1】:

使用这个:

string ignored = sonConvert.SerializeObject(movie,
        Formatting.Indented,
        new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });

示例如下:

public class Movie
{
    public string Name { get; set; }
    public string Description { get; set; }
    public string Classification { get; set; }
    public string Studio { get; set; }
    public DateTime? ReleaseDate { get; set; }
    public List<string> ReleaseCountries { get; set; }
}

static void Main(string[] args)
{
    Movie movie = new Movie();
    movie.Name = "Bad Boys III";
    movie.Description = "It's no Bad Boys";

    string included = JsonConvert.SerializeObject(movie,
        Formatting.Indented,new JsonSerializerSettings { });

            // {
            //   "Name": "Bad Boys III",
            //   "Description": "It's no Bad Boys",
            //   "Classification": null,
            //   "Studio": null,
            //   "ReleaseDate": null,
            //   "ReleaseCountries": null
            // }

            string ignored = JsonConvert.SerializeObject(movie,
              Formatting.Indented,
              new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });

            // {
            //   "Name": "Bad Boys III",
            //   "Description": "It's no Bad Boys"
            // }
        }

【讨论】:

  • 您也可以将数据属性放在您想要(忽略)的属性上
  • @JeetDaloneboy,我现在正在使用这种方法,它导致了让我回答这个问题的问题。 NullValueHandling.Ignore 仅忽略完全为空的子对象。如果我正在序列化的对象中有一个子对象,并且该子对象有 10 个属性,并且其中只有一个属性不是 null ,那么它将导致字符串具有 9 个 null 并且只有一个有意义的属性。我希望 json 忽略 nested 空属性。
  • @JeetDaloneboy,我添加了一个代码示例作为答案,因为评论太长了
  • 非常感谢您的帮助,@JeetDaloneboy,但您建议的答案在我的环境中不起作用。我的代码完全一样!也许我正在为 Unity3d 使用 json.net 版本? (这意味着 .net 2.0)
猜你喜欢
  • 1970-01-01
  • 2014-02-13
  • 2020-04-04
  • 2016-08-31
  • 1970-01-01
  • 2022-06-17
  • 2021-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多