У меня есть следующая строка JSON, полученная от внешней стороны.
{
"team":[
{
"v1":"",
"attributes":{
"eighty_min_score":"",
"home_or_away":"home",
"score":"22",
"team_id":"500"
}
},
{
"v1":"",
"attributes":{
"eighty_min_score":"",
"home_or_away":"away",
"score":"30",
"team_id":"600"
}
}
]
}
Мои классы картирования:
public class Attributes
{
public string eighty_min_score { get; set; }
public string home_or_away { get; set; }
public string score { get; set; }
public string team_id { get; set; }
}
public class Team
{
public string v1 { get; set; }
public Attributes attributes { get; set; }
}
public class RootObject
{
public List<Team> team { get; set; }
}
Вопрос в том, что мне не нравятся Attributes
имя класса и attributes
имена полей в Team
классе. Вместо этого я хочу, чтобы он был назван, TeamScore
а также удалял _
из имен полей и давал имена собственные.
JsonConvert.DeserializeObject<RootObject>(jsonText);
Я могу переименовать Attributes
в TeamScore
, но если я изменю имя поля ( attributes
в Team
классе), оно не будет десериализовано должным образом и даст мне null
. Как я могу преодолеть это?
Ответы:
Json.NET имеет,
JsonPropertyAttribute
что позволяет вам указать имя свойства JSON, поэтому ваш код должен быть:Документация: атрибуты сериализации
источник
Если вы хотите использовать динамическое отображение и не хотите загромождать свою модель атрибутами, этот подход сработал для меня
Использование:
Логика:
источник
Добавляем в домкрат решение. Мне нужно десериализовать с помощью JsonProperty и Serialize, игнорируя JsonProperty (или наоборот). ReflectionHelper и Attribute Helper - это просто вспомогательные классы, которые получают список свойств или атрибутов для свойства. Я могу включить, если кому-то все равно. Используя приведенный ниже пример, вы можете сериализовать модель представления и получить «Amount», даже если JsonProperty имеет значение «RecurringPrice».
Использование:
Модель:
источник
CreateProperty
в ContractResolver. Там называют базу:var jsonProperty = base.CreateProperty(memberInfo, memberSerialization);
а потом устанавливаемjsonProperty.PropertyName = memberInfo.Name;
. Наконецreturn jsonProperty;
это все, что вам нужно.Раскрывая ответ Rentering.com , в сценариях, когда необходимо позаботиться о целом графике многих типов, и вы ищете строго типизированное решение, этот класс может помочь, см. Использование (свободно) ниже. Он работает как черный список или белый список для каждого типа. Тип не может быть и тем и другим ( Gist - также содержит глобальный список игнорирования).
Использование:
источник
Я использую атрибуты JsonProperty при сериализации, но игнорирую их при десериализации с использованием этого
ContractResolver
:Метод
ContractResolver
just устанавливает каждое свойство обратно на имя свойства класса (упрощенное из решения Шимми). Использование:источник