Как изменить имена свойств при сериализации с Json.net? - PullRequest
379 голосов
/ 10 января 2012

У меня есть некоторые данные в объекте C # DataSet. Я могу сериализовать его прямо сейчас, используя конвертер Json.net, как этот

DataSet data = new DataSet();
// do some work here to populate 'data'
string output = JsonConvert.SerializeObject(data);

Однако при печати в файл .json используются имена свойств из data. Я хотел бы изменить имена свойств на что-то другое (скажем, изменить 'foo' на 'bar').

В документации Json.net в разделе «Сериализация и десериализация JSON» → «Атрибуты сериализации» говорится «JsonPropertyAttribute ... позволяет настраивать имя». Но нет примера. Кто-нибудь знает, как использовать атрибут JsonPropertyAttribute для изменения имени свойства на другое?

( Прямая ссылка на документацию )

Документация Json.net, похоже, скудная. Если у вас есть отличный пример, я постараюсь добавить его в официальную документацию. Спасибо!

Ответы [ 3 ]

715 голосов
/ 10 января 2012

Вы можете украсить желаемое свойство, управляя его именем, с атрибутом [JsonProperty], который позволяет указать другое имя:

using Newtonsoft.Json;
// ...

[JsonProperty(PropertyName = "FooBar")]
public string Foo { get; set; }

Документация: Атрибуты сериализации

64 голосов
/ 23 октября 2015

Если у вас нет доступа к классам для изменения свойств или вы не хотите всегда использовать одно и то же свойство переименования, переименование также можно сделать, создав собственный распознаватель.

Например, если у вас есть класс с именем MyCustomObject, у которого есть свойство с именем LongPropertyName, вы можете использовать собственный распознаватель, такой как…

public class CustomDataContractResolver : DefaultContractResolver
{
  public static readonly CustomDataContractResolver Instance = new CustomDataContractResolver ();

  protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
  {
    var property = base.CreateProperty(member, memberSerialization);
    if (property.DeclaringType == typeof(MyCustomObject))
    {
      if (property.PropertyName.Equals("LongPropertyName", StringComparison.OrdinalIgnoreCase))
      {
        property.PropertyName = "Short";
      }
    }
    return property;
  }
}

Затем вызовите сериализацию и предоставьте преобразователь:

 var result = JsonConvert.SerializeObject(myCustomObjectInstance,
                new JsonSerializerSettings { ContractResolver = CustomDataContractResolver.Instance });

И результат будет сокращен до {"Short": "значение prop"} вместо {"LongPropertyName": "значение prop"}

Подробнее о пользовательских распознавателях здесь

4 голосов
/ 06 февраля 2018

Есть еще один способ сделать это, используя конкретный NamingStrategy , который можно применить к классу или свойству, украсив их [JSonObject] или [JsonProperty].

Существуют предопределенные стратегии именования, например CamelCaseNamingStrategy, но вы можете реализовать свои собственные.

Реализация различных стратегий именования может быть найдена здесь: https://github.com/JamesNK/Newtonsoft.Json/tree/master/Src/Newtonsoft.Json/Serialization

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...