C# WebApi - Json serialize выводит свойство на более высокий уровень - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть класс со следующей структурой

class Model
{
   public int Id {get;set;}
   public Dictionary<string, List<ComplexType>> Values {get;set;}
}

, используемый в проекте webApi Dotnetcore и возвращенный из моего контроллера в качестве следующего объекта

Ok(new List<Model>() { 
new Model{
  Id = 1,
  Values = new Dictionary<string, List<ComplexType>>() { {"Item1", new List<ComplexType>()} }
} } )

, который будет выдавать Json вывод as:

[
     {
         "Id": "1"
         "Values": {
           "Item1": [{}]
          }
     }
]

Так что мой вопрос возможен, чтобы вывести имя свойства Dictionary на более высокий уровень в структуре вывода Json. В основном, пропуская имя свойства «Значения» в классе «Модель» и объединяя нижний объект, чтобы он выглядел примерно так:

[
     {
         "Id": "1"
         "Item1": [{}]
     }
]

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Вы можете удалить это свойство Value вместе и сделать Model типом словаря

class Model : Dictionary<string, List<ComplexType>> 
{
     public int Id { get; set; } 
} 

, тогда вы можете просто сделать

var model = new Model();
model.Id = 123;
model["Item1"] = new List<ComplexType>();
0 голосов
/ 12 февраля 2020

Вы можете написать свой собственный сериализатор, он будет проще, чем вы думаете, и у вас будет намного больше контроля над сгенерированным json.

class Model
{
    public int Id { get; set; }
    public Dictionary<string, List<ComplexType>> Values { get; set; }

    public string ToJson()
    {
        return
            $"{{" +
            $"\"{nameof(Id)}\":\"{Id}\"," +
            string.Join(",", Values.Select(x => $"\"{x.Key}\":" + Newtonsoft.Json.JsonConvert.SerializeObject(x.Value))) +
            $"}}";
    }
}

Тогда назовите его так -

var json = "[" + string.Join(",", obj.Select(x => x.ToJson())) + "]";

Наконец, верните выше json в качестве ответа.

var response = this.Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(json, Encoding.UTF8, "application/json");
return response;
...