Как изменить имена свойств при сериализации с помощью 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
, но вы можете реализовать свои собственные.