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

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

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

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

в Json.net документация, в разделе "сериализация и десериализация JSON" → " атрибуты сериализации "говорится:" JsonPropertyAttribute... позволяет настроить имя". Но примера нет. кто-нибудь знает, как использовать JsonPropertyAttribute для изменения имени свойства на что-то другое?

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

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

3 ответов


вы можете украсить свойство, которое вы хотите контролировать его имя с


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

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

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


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

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