将 POCO class 序列化为 JSON 字符串时如何写入空属性?

How to write Null Properties when Serializing POCO class to JSON string?

我有一个Class如下

public class User
    {

        [JsonProperty("username")]
        string userName;
        public string Username {

            get { return userName + " Jack"; }
            set { userName = value; }
        } 

        [JsonProperty("name")]
        public string Name { get; set; }

        [JsonProperty("location")]
        public string Location { get; set; }


        [JsonProperty("badges")]
        public List<Badge> Badges { get; set; }

        [JsonProperty("accounts")]
        public List<Account> Accounts { get; set; }
    }


    public class Account
    {

        [JsonProperty("role")]
        public string Role = "Default";
        [JsonProperty("description")]
        public string Description = null;
        [JsonProperty("accessLevel")]
        public string AccessLevel = null;
    }

    public class Badge
    {
        [JsonProperty("name")]
        public string Name = null;
        [JsonProperty("description")]
        public string Description;
        [JsonProperty("created")]
        public string Created;
        [JsonProperty("badge")]
        public string BadgeUrl = null;
    }

我正在将 JSON 反序列化为 class,如下所示,请注意,在 JSON 中,帐户部分未通过

{
  "username": "mdeiters",
  "Username": "mdeiters Sathish",
  "location": "San Francisco",
  "endorsements": 120,
  "team": "14748",
  "badges": [
    {
      "name": "Charity",
      "description": "Fork and commit to someone's open source project in need",
      "created": "2013-06-14T22:40:45Z",
      "badge": "https://d3levm2kxut31z.cloudfront.net/assets/badges/charity-b7c8758441a70e8378d6332ec15ef292.png"
    },
    {
      "name": "KO Judge",
      "description": "Official Judge of the 2012 Node Knockout",
      "created": "2012-11-30T01:39:08Z",
      "badge": "https://d3levm2kxut31z.cloudfront.net/assets/badges/ko-judge-2012-4e9a536d23bf17b7401de8a6f6e28024.png"
    }
  ]
 }

之后我将这个 POCO class 序列化为 JSON String

var user = JsonConvert.DeserializeObject<User>(strInput);
string output = JsonConvert.SerializeObject(user, Formatting.Indented, new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Include });

但是当我检查我的输出字符串用户时,它给出了

"{\r\n  \"username\": \"mdeiters Sathish\",\r\n  \"Username\": \"mdeiters Sathish Sathish\",\r\n  \"name\": null,\r\n  \"location\": \"San Francisco\",\r\n  \"endorsements\": 120,\r\n  \"team\": \"14748\",\r\n  \"badges\": [\r\n    {\r\n      \"name\": \"Charity\",\r\n      \"description\": \"Fork and commit to someone's open source project in need\",\r\n      \"created\": \"2013-06-14T22:40:45Z\",\r\n      \"badge\": \"https://d3levm2kxut31z.cloudfront.net/assets/badges/charity-b7c8758441a70e8378d6332ec15ef292.png\"\r\n    },\r\n    {\r\n      \"name\": \"KO Judge\",\r\n      \"description\": \"Official Judge of the 2012 Node Knockout\",\r\n      \"created\": \"2012-11-30T01:39:08Z\",\r\n      \"badge\": \"https://d3levm2kxut31z.cloudfront.net/assets/badges/ko-judge-2012-4e9a536d23bf17b7401de8a6f6e28024.png\"\r\n    }\r\n  ],\r\n  \"accounts\": null\r\n}"

其中Account为Null我希望accounts写成如下

\"accounts\": [\r\n    {\r\n      \"role\": null,\r\n      \"description\": null,\r\n      \"accessLevel\": null\r\n    }\r\n  ]\r\n}"

请帮我解决这个问题

您想序列化 NULL 值吗?如果我正确地找到了你的问题,那么你可以看看 JsonSerializerSettings class 并在这个 class 里面看看 NullValueHandling 属性 并检查它是否可以帮助你。

一方面,您的 JSON 字符串没有 accounts 属性,这意味着您的 User 对象将具有 Accounts 属性 作为NULL 另一方面,在您的输出中,您希望 Account 属性 的对象是 NULL 而不是 属性 本身。所以可以通过两种方式来实现。 1) 您需要输入以下 json 字符串。

{
    "username": "mdeiters",
    "Username": "mdeiters Sathish",
    "location": "San Francisco",
    "endorsements": 120,
    "team": "14748",
    "badges": [
        {
            "name": "Charity",
            "description": "Fork and commit to someone's open source project in need",
            "created": "2013-06-14T22:40:45Z",
            "badge": "https://d3levm2kxut31z.cloudfront.net/assets/badges/charity-b7c8758441a70e8378d6332ec15ef292.png"
        },
        {
            "name": "KO Judge",
            "description": "Official Judge of the 2012 Node Knockout",
            "created": "2012-11-30T01:39:08Z",
            "badge": "https://d3levm2kxut31z.cloudfront.net/assets/badges/ko-judge-2012-4e9a536d23bf17b7401de8a6f6e28024.png"
        }
    ],
    "accounts": [
        {}
    ]
}

)

或者 2)反序列化对象后,您将必须初始化 accounts 属性

var user = JsonConvert.DeserializeObject<User>(strInput);
user.Accounts = new List<Account>();
user.Accounts.add(new Account());
string output = JsonConvert.SerializeObject(user, Formatting.Indented, new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Include });

任何这些都应该产生预期的结果。