вложенный объект json из одной модели

#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
  }
}