我正在使用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编写器.
你可以尝试使用CamelCasePropertyNamesContractResolver
.
var serializerSettings = new JsonSerializerSettings(); serializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); var json = JsonConvert.SerializeObject(product, serializerSettings);
我只是不确定它将如何处理字典键,我没有时间在第二次尝试它.如果它没有正确处理密钥,那么仍然值得记住未来,而不是编写自己的自定义JSON编写器.
您可以使用JsonProperty来更改某些内容的序列化/反序列化.定义对象时,将属性项添加到要在JSON中以不同方式表示的字段中.这仅适用于NewtonsoftJSON.其他图书馆可能采用不同的方式
public class Product { [JsonProperty("name")] public string Name { get; set; } [JsonProperty("items")] public DictionaryItems { get; set; } } public class Item { [JsonProperty("description")] public string Description { get; set; } }