#c# #json #json-deserialization
Вопрос:
У меня есть класс модели, как показано ниже:
public class ApiRequest{
[JsonProperty(PropertName="name")]
public string Name{get;set;}
[JsonProperty(PropertName="description")]
public string Description{get;set;}
[JsonProperty(PropertName="privacy.view")]
public string PrivacyStats {get;set}
}
И когда я вызываю API, он должен преобразовать эту модель в json с вложенным объектом для статуса конфиденциальности, как показано ниже
{
"name":"Test1",
"description":"Testing Only",
"privacy":{
"view":"unlisted"
}
}
Как я могу сопоставить одну модель с вложенным объектом, не создавая для этого другого класса?
Комментарии:
1. Вы пробовали использовать динамический тип для статуса ?
2. В зависимости от используемого вами сериализатора JSON (например, Newtonsoft json) вам придется реализовать соответствующий конвертер. Вы можете проверить этот пример для newtonsoft: newtonsoft.com/json/help/html/CustomJsonConverter.htm
3. Довольно проще добавить дополнительную модель для поля json
privacy
с одним полем, чем реализовать пользовательский конвертер и поддерживать его.
Ответ №1:
Вам следует объявить еще одну модель для PropertyStats
. В противном случае изменение уже созданной строки будет своего рода обратным проектированием JSON
.
Подобный этому:
public class ApiRequest
{
[JsonProperty(PropertyName = "name")]
public string Name { get; set; }
[JsonProperty(PropertyName = "description")]
public string Description { get; set; }
[JsonProperty(PropertyName = "privacy")]
public PropertyStats PrivacyStats { get; set; }
}
public class PropertyStats
{
[JsonProperty(PropertyName = "view")]
public string View { get; set; }
}
Затем вы можете сериализовать его следующим образом.
static void Main(string[] args)
{
ApiRequest objApiRequest = new ApiRequest()
{
Name = "Test1",
Description = "Testing Only",
PrivacyStats = new PropertyStats
{
View = "unlisted"
}
};
var serializedString = JsonConvert.SerializeObject(objApiRequest, Formatting.Indented);
Console.WriteLine(serializedString);
Console.ReadLine();
}
Выход:
{
"name": "Test1",
"description": "Testing Only",
"privacy": {
"view": "unlisted"
}
}
В будущем, если вы захотите добавить дополнительное свойство в модель конфиденциальности, его будет легко сериализовать.
Как показано ниже:
public class PropertyStats
{
[JsonProperty(PropertyName = "view")]
public string View { get; set; }
[JsonProperty(PropertyName = "status")]
public int StatusCode { get; set; }
}
Сериализуйте, как показано ниже:
static void Main(string[] args)
{
ApiRequest objApiRequest = new ApiRequest()
{
Name = "Test1",
Description = "Testing Only",
PrivacyStats = new PropertyStats
{
View = "unlisted",
StatusCode = 1
}
};
var serializedString = JsonConvert.SerializeObject(objApiRequest, Formatting.Indented);
Console.WriteLine(serializedString);
Console.ReadLine();
}
Выход:
{
"name": "Test1",
"description": "Testing Only",
"privacy": {
"view": "unlisted",
"status": 1
}
}