Подтвердить что ты не робот

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);
    }
}
4b9b3361

Ответ 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; }
}