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