Как вернуть содержимое json с отступом из контроллера OData в веб-API ASP.NET?

Я могу получить желаемый результат json из обычного WebApi, используя следующий способ.

  services.AddMvc()
         .SetCompatibilityVersion(CompatibilityVersion.Version
public class EmployeeController : ODataController
{

    [EnableQuery()]
    public IActionResult Get()
    {
        return Ok(new BOContext().Employees.ToList());
    }
}
1) .AddJsonOptions(x=> { x.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented; });

Но я не могу найти способ вывода json, подобного этому, при использовании ODataController, в отличие от ControllerBase, когда используется веб-API. ODataController всегда отправляет минимизированный файл json.

public class EmployeeController : ODataController
{

    [EnableQuery()]
    public IActionResult Get()
    {
        return Ok(new BOContext().Employees.ToList());
    }
}

Кроме того, startup.cs

 public class Startup
    {
        private static IEdmModel GetModel()
        {
            ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
            builder.EntitySet<Employee>("Employee");
            return builder.GetEdmModel();
        }

        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {

            services.AddOData();
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });



            services.AddMvc()
                .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
                .AddJsonOptions(x=>
                {
                    x.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.None;
                });
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }

            app.UseStaticFiles();
            app.UseCookiePolicy();

            app.UseMvc(routes =>
            {
                routes.MapODataServiceRoute("odata", "odata", GetModel());
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");

            });
        }
    }

Маршрут работает, и я получаю правильные данные.

Есть ли способ контролировать и выводить json с отступом из контроллера OData?


comment
есть ли какая-то конкретная причина, по которой вы хотели бы вернуть json с отступом вместо дружественной к ресурсам минимизированной версии?   -  person Derviş Kayımbaşıoğlu    schedule 29.12.2018
comment
Я создаю своего рода бэкэнд, где в представлении отображается какой-то json, который нужно отредактировать. Этим пользуется какой-нибудь продвинутый пользователь. Для удобства использования это должен быть читаемый файл json. Если бы это могло быть выполнено сервером, было бы здорово.   -  person XPD    schedule 29.12.2018


Ответы (2)


Я предлагаю вам выполнить передачу с уменьшенным jsonm, но используйте json beutifier для отображения отформатированного json. не делайте этого на этапе потока данных.

Если вы используете javascript на стороне интерфейса. Вы можете просто использовать

JSON.stringify(jsObj, null, "\t"); // stringify with tabs inserted at each level
JSON.stringify(jsObj, null, 2);    // stringify with 2 spaces at each level
person Derviş Kayımbaşıoğlu    schedule 29.12.2018
comment
Спасибо за вариант JSON.stringify. - person XPD; 29.12.2018

Не уверен, что это все еще актуально, но вы можете указать средство форматирования при возврате данных

// [...]
public IActionResult Get()
        {
            var res = Ok(_db.Employees);
            res.Formatters.Add(new Microsoft.AspNetCore.Mvc.Formatters.JsonOutputFormatter(
                new Newtonsoft.Json.JsonSerializerSettings() { Formatting = Newtonsoft.Json.Formatting.Indented }, 
                System.Buffers.ArrayPool<char>.Create()));
            return res;
        }

И, конечно же, если вам нужно более обобщенное решение (или у вас просто есть много кода, который уже написан), вы можете создать промежуточный абстрактный класс и наследовать от этого класса, а не просто ODataController:

public abstract class AbstractFormattedOdataController : ODataController
    {
        public override OkObjectResult Ok(object value)
        {
            var res = base.Ok(value);
            res.Formatters.Add(new Microsoft.AspNetCore.Mvc.Formatters.JsonOutputFormatter(
                new Newtonsoft.Json.JsonSerializerSettings() { Formatting = Newtonsoft.Json.Formatting.Indented },
                System.Buffers.ArrayPool<char>.Create()));
            return res;
        }
    }
// [...]
public class EmployeesController : AbstractFormattedOdataController 
{
    [EnableQuery()]
    public IActionResult Get()
    {
        return Ok(new BOContext().Employees.ToList());
    }
}
person Dmitry Andrievsky    schedule 10.09.2019