当前位置:  开发笔记 > 编程语言 > 正文

Newtonsoft JsonSerializer - 小写属性和字典

如何解决《NewtonsoftJsonSerializer-小写属性和字典》经验,为你挑选了2个好方法。

我正在使用json.net(Newtonsoft的JsonSerializer).我需要自定义序列化以满足以下要求:

    属性名称必须以小写字母开头.

    必须将字典序列化为jsonp,其中键将用于属性名称.LowerCase规则不适用于字典键.

例如:

var product = new Product();
procuct.Name = "Product1";
product.Items = new Dictionary();
product.Items.Add("Item1", new Item { Description="Lorem Ipsum" });

必须序列化为:

{
  name: "Product1",
  items : {
    "Item1": {
       description : "Lorem Ipsum"
    }
  }
}

注意属性Name序列化为"name",但键Item1序列化为"Item1";

我试图创建CustomJsonWriter来序列化属性名称,但它也改变了dicionary键.

public class CustomJsonWriter : JsonTextWriter
{
    public CustomJsonWriter(TextWriter writer) : base(writer)
    {

    }
    public override void WritePropertyName(string name, bool escape)
    {
        if (name != "$type")
        {
            name = name.ToCamelCase();
        }
        base.WritePropertyName(name, escape);
    }
}

Craig W... 111

你可以尝试使用CamelCasePropertyNamesContractResolver.

var serializerSettings = new JsonSerializerSettings();
serializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
var json = JsonConvert.SerializeObject(product, serializerSettings);

我只是不确定它将如何处理字典键,我没有时间在第二次尝试它.如果它没有正确处理密钥,那么仍然值得记住未来,而不是编写自己的自定义JSON编写器.



1> Craig W...:

你可以尝试使用CamelCasePropertyNamesContractResolver.

var serializerSettings = new JsonSerializerSettings();
serializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
var json = JsonConvert.SerializeObject(product, serializerSettings);

我只是不确定它将如何处理字典键,我没有时间在第二次尝试它.如果它没有正确处理密钥,那么仍然值得记住未来,而不是编写自己的自定义JSON编写器.


小心这个选项.此选项还会导致序列化词典的小写键.这通常不是所期望的.
如果只希望将框应用于一个对象,则可以使用:`var json = JsonConvert.SerializeObject(product,new JsonSerializerSettings {ContractResolver = new CamelCasePropertyNamesContractResolver(),Formatting = Formatting.Indented});`
这个问题的答案说明了如何使用小写来实现自己的ContractResolver./sf/ask/17360801/

2> Brian from s..:

您可以使用JsonProperty来更改某些内容的序列化/反序列化.定义对象时,将属性项添加到要在JSON中以不同方式表示的字段中.这仅适用于NewtonsoftJSON.其他图书馆可能采用不同的方式

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

    [JsonProperty("items")]
    public Dictionary Items { get; set; }
}

public class Item
{
    [JsonProperty("description")]
    public string Description { get; set; }
}


这不违反.它提供了在处理数据序列化时可能需要的映射.这是由于C#变量名称与底层序列化格式不匹配 - 不仅限于JSON.
在这种情况下,知识是属性名称和用于序列化的约定.但由于您同时指定了属性名称和相关的序列化属性名称,因此它们不会保持同步.在您的示例中,更改一个元素需要(属性名称)需要更改另一个元素(序列化属性名称).显然违反DRY
推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有