Как изменить имена свойств при сериализации с помощью Json.net?

У меня есть некоторые данные в объекте С# 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 documentation в разделе "Сериализация и десериализация JSON" → "Атрибуты сериализации" говорится: "JsonPropertyAttribute... позволяет имя, которое нужно настроить". Но нет примера. Кто-нибудь знает, как использовать JsonPropertyAttribute, чтобы изменить имя свойства на что-то еще?

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

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

Ответ 1

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

using Newtonsoft.Json;
// ...

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

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

Ответ 2

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

Например, если у вас есть класс с именем 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 value"} вместо {"LongPropertyName": "prop value"}

Больше информации о пользовательских резольверах здесь

Ответ 3

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

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