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

У меня есть некоторые данные в объекте C # DataSet. Я могу сериализовать его прямо сейчас, используя конвертер 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 выглядит скудной. Если у вас есть отличный пример, я попытаюсь добавить его в официальную документацию. Благодаря!

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

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

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

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

Например, если у вас есть class под названием 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»}

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

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

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

  • GSON десериализует значение ключа для пользовательского объекта
  • StackOverflowError при сериализации объекта в Java
  • Заставить JSON.NET включать миллисекунды при сериализации DateTime (даже если компонент ms равен нулю)
  • JSON.Net выдает StackOverflowException при использовании
  • Как превратить объект C # в строку JSON в .NET?
  • jackson - Как обрабатывать (десериализовать) вложенный JSON?
  • Как вы делаете глубокую копию объекта в .NET (например, C #)?
  • Использование readObject / writeObject в сериализации
  • JSON.Net Обнаружен собственный цикл привязки
  • «Тип не ожидается», используя DataContractSerializer - но это просто class, не смешные вещи?
  • Сериализация нулевого значения в JSON.NET
  • Давайте будем гением компьютера.