Newtonsoft JsonSerializer - свойства нижнего регистра и словарь
Я использую json.net(Newtonsoft JsonSerializer). Мне нужно настроить сериализацию, чтобы соответствовать следующим требованиям:
- Имена свойств должны начинаться с строчной буквы.
- Словарь должен быть сериализован в jsonp, где ключи будут использоваться для имен свойств. Правило LowerCase не применяется для ключей словаря.
например:
var product = new Product();
procuct.Name = "Product1";
product.Items = new Dictionary<string, Item>();
product.Items.Add("Item1", new Item { Description="Lorem Ipsum" });
должен быть сериализован в:
{
name: "Product1",
items : {
"Item1": {
description : "Lorem Ipsum"
}
}
}
обратите внимание, что имя свойства сериализуется в "имя", но ключ Item1 сериализуется в "Item1";
Я попытался создать CustomJsonWriter для сериализации имен свойств, но он также меняет ключи.
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);
}
}
Ответы
Ответ 1
Вы можете попробовать использовать CamelCasePropertyNamesContractResolver
.
var serializerSettings = new JsonSerializerSettings();
serializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
var json = JsonConvert.SerializeObject(product, serializerSettings);
Я просто не уверен, как это будет обрабатывать ключи словаря, и я не имею времени на эту секунду, чтобы попробовать. Если он не обрабатывает ключи правильно, все равно стоит помнить о будущем, а не писать собственный пользовательский JSON-писатель.
Ответ 2
Вы можете использовать JsonProperty для изменения того, как что-то сериализуется/десериализируется. Когда вы определяете свой объект, добавьте объекты свойств в поля, которые вы хотели бы представить по-разному в JSON. Это работает только с NewtonsoftJSON. Другие библиотеки могут делать это по-другому.
public class Product
{
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("items")]
public Dictionary<string, Item> Items { get; set; }
}
public class Item
{
[JsonProperty("description")]
public string Description { get; set; }
}