Как получить данные json, которые модель включает в себя текстовое свойство json в веб-интерфейсе asp.net? - PullRequest
0 голосов
/ 18 октября 2019

У меня есть таблица базы данных с именем «application» в моей базе данных postgresql.

id    name     settings
----------------------------------------------------------------
1     x        "{"color":"red", "left":"30px"}"
2     y        "{"menuSize":"4", "menuOrientation":"horizontal"}"

мои параметры columnn имеют тип текста, который включает в себя данные json в качестве текстового формата.

Я использую этоданные в моем приложении ASP.NET веб-приложения. WAB API может преобразовать объект в данные JSON.

public class AppController : ApiController
{
    App[] apps = new App[] 
    { 
        new App { Id = 1, Name = "x" }, 
        new App { Id = 2, Name = "y" }
    };

    public IEnumerable<App> GetApps()
    {
        return apps;
    }
}

Но моя модель содержит строковое свойство, имеющее данные в формате json.

public class AppController : ApiController
{
    App[] apps = new App[] 
    { 
        new App { Id = 1, Name = "x", Settings = "{\"color\":\"red\", \"left\":\"30px\"}" }
    };

    public IEnumerable<App> GetApps()
    {
        return apps;
    }
}

Я хочу получить ответ json, например:

[
    {
        id: 1,
        name: "x",
        color: "color",
        left: "30px"
    }
]

все столбцы конвертируются в формат json.

Ответы [ 2 ]

1 голос
/ 18 октября 2019

Используйте библиотеку Newtonsoft для анализа json, а затем добавьте новые свойства

public HttpResponseMessage  GetApps()
    JObject jsonObject = JObject.Parse("{\"color\":\"red\", \"left\":\"30px\"}");
    jsonObject.Add("id", 1);
    jsonObject.Add("name", x);

    return new HttpResponseMessage {
         Content = new StringContent(jsonObject.ToString(Formatting.None), Encoding.UTF8, "application/json"),
    };
}
0 голосов
/ 18 октября 2019

Попробуйте использовать приведенный ниже код для возврата 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;

    }
...