Попробуйте использовать приведенный ниже код для возврата IEnumerable<JObject>
, поскольку ваши ключи в settings
являются динамическими.
public IEnumerable<JObject> GetApps()
{
var jsonList = new List<JObject>();
App[] apps = new App[]
{
new App { Id = 1, Name = "x", Settings = "{\"color\":\"red\", \"left\":\"30px\"}" },
new App { Id = 2, Name = "y", Settings = "{\"menuSize\":\"4\", \"menuOrientation\":\"horizontal\"}" }
};
foreach(var app in apps)
{
var obj = new JObject();
obj.Add("id", app.Id);
obj.Add("name", app.Name);
JObject settingsJsonObj = JObject.Parse(app.Settings);
foreach (var property in settingsJsonObj.Properties())
{
var name = property.Name;
obj.Add(name, settingsJsonObj.GetValue(name));
}
jsonList.Add(obj);
}
return jsonList;
}
Результат:
[
{
"id": 1,
"name": "x",
"color": "red",
"left": "30px"
},
{
"id": 2,
"name": "y",
"menuSize": "4",
"menuOrientation": "horizontal"
}
]
Если вы используете ядро asp.net3.0, вам нужно добавить ссылку на пакет к Microsoft.AspNetCore.Mvc.NewtonsoftJson
и обновить Startup.ConfigureServices
для вызова AddNewtonsoftJson.
services.AddMvc().AddNewtonsoftJson();
Обновление:
Ниже приведена демонстрационная версия дляиспользуйте специальный конвертер json в asp.net core 3.0 с Newtonsoft.Json
;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
public class AppJsonConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteStartObject();
{
writer.WritePropertyName("Id");
writer.WriteValue(value.GetType().GetProperty("Id").GetValue(value).ToString());
writer.WritePropertyName("Name");
writer.WriteValue(value.GetType().GetProperty("Name").GetValue(value).ToString());
var settings = value.GetType().GetProperty("Settings").GetValue(value);
JObject settingsJsonObj = JObject.Parse(settings.ToString());
foreach (var property in settingsJsonObj.Properties())
{
var name = property.Name;
writer.WritePropertyName(name);
writer.WriteValue(settingsJsonObj.GetValue(name));
}
}
writer.WriteEndObject();
}
public override bool CanConvert(Type objectType)
{
throw new NotImplementedException();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
Модель:
[JsonConverter(typeof(AppJsonConverter))]
public class App
{
public int Id { get; set; }
public string Name { get; set; }
public string Settings { get; set; }
}
Контроллер:
//add `using Newtonsoft.Json;`
public IEnumerable<Object> GetApps()
{
App[] apps = new App[]
{
new App { Id = 1, Name = "x", Settings = "{\"color\":\"red\", \"left\":\"30px\"}" },
new App { Id = 2, Name = "y", Settings = "{\"menuSize\":\"4\", \"menuOrientation\":\"horizontal\"}" }
};
var jsonServices = JsonConvert.SerializeObject(apps);
var result = JsonConvert.DeserializeObject<List<Object>>(jsonServices);
return result;
}