Pertanyaan Web API 2: cara mengembalikan JSON dengan nama properti camelCased, pada objek dan sub-objeknya


MEMPERBARUI

Terima kasih atas semua jawabannya. Saya sedang mengerjakan proyek baru dan sepertinya saya sudah sampai ke dasar ini: Sepertinya kode berikut sebenarnya yang harus disalahkan:

public static HttpResponseMessage GetHttpSuccessResponse(object response, HttpStatusCode code = HttpStatusCode.OK)
{
    return new HttpResponseMessage()
    {
        StatusCode = code,
        Content = response != null ? new JsonContent(response) : null
    };
}

di tempat lain...

public JsonContent(object obj)
{
    var encoded = JsonConvert.SerializeObject(obj, Newtonsoft.Json.Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore } );
    _value = JObject.Parse(encoded);

    Headers.ContentType = new MediaTypeHeaderValue("application/json");
}

Saya telah mengabaikan JsonContent yang tidak berbahaya dengan asumsi itu adalah WebAPI tetapi tidak.

Ini digunakan dimana mana... Bisakah saya menjadi yang pertama mengatakan, wtf? Atau mungkin itu seharusnya "Mengapa mereka melakukan ini?"


pertanyaan asli berikut

Orang akan mengira ini akan menjadi pengaturan konfigurasi yang sederhana, tapi itu menghindarkan saya terlalu lama sekarang.

Saya telah melihat berbagai solusi dan jawaban:

https://gist.github.com/rdingwall/2012642

tampaknya tidak berlaku untuk versi WebAPI terbaru ...

Berikut ini tampaknya tidak berfungsi - nama properti masih PascalCased.

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;

json.UseDataContractJsonSerializer = true;
json.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;

json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 

Jawaban Mayank di sini: CamelCase JSON WebAPI Sub-Objek (Nested objects, child objects) tampak seperti jawaban yang tidak memuaskan tetapi bisa diterapkan sampai saya menyadari atribut ini harus ditambahkan ke kode yang dihasilkan karena kami menggunakan linq2sql ...

Ada cara untuk melakukan ini secara otomatis? Ini 'jahat' telah menjangkiti saya untuk waktu yang lama sekarang.


75
2018-02-17 00:10


asal


Jawaban:


Menyatukan semua yang Anda dapatkan ...

protected void Application_Start()
{
    HttpConfiguration config = GlobalConfiguration.Configuration;
    config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
    config.Formatters.JsonFormatter.UseDataContractJsonSerializer = false;
}

141
2018-02-17 01:55



Inilah yang berhasil untuk saya:

internal static class ViewHelpers
{
    public static JsonSerializerSettings CamelCase
    {
        get
        {
            return new JsonSerializerSettings {
                ContractResolver = new CamelCasePropertyNamesContractResolver()
            };
        }
    }
}

Lalu:

[HttpGet]
[Route("api/campaign/list")]
public IHttpActionResult ListExistingCampaigns()
{
    var domainResults = _campaignService.ListExistingCampaigns();
    return Json(domainResults, ViewHelpers.CamelCase);
}

Kelas CamelCasePropertyNamesContractResolver datang dari Newtonsoft.Json.dll di Json.NET Perpustakaan.


22
2018-02-17 07:27



Semua jawaban di atas tidak berhasil untuk saya dengan Owin Hosting dan Ninject. Inilah yang berhasil untuk saya:

public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        // Get the ninject kernel from our IoC.
        var kernel = IoC.GetKernel();

        var config = new HttpConfiguration();

        // More config settings and OWIN middleware goes here.

        // Configure camel case json results.
        ConfigureCamelCase(config);

        // Use ninject middleware.
        app.UseNinjectMiddleware(() => kernel);

        // Use ninject web api.
        app.UseNinjectWebApi(config);
    }

    /// <summary>
    /// Configure all JSON responses to have camel case property names.
    /// </summary>
    private void ConfigureCamelCase(HttpConfiguration config)
    {
        var jsonFormatter = config.Formatters.JsonFormatter;
        // This next line is not required for it to work, but here for completeness - ignore data contracts.
        jsonFormatter.UseDataContractJsonSerializer = false;
        var settings = jsonFormatter.SerializerSettings;
#if DEBUG
        // Pretty json for developers.
        settings.Formatting = Formatting.Indented;
#else
        settings.Formatting = Formatting.None;
#endif
        settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
    }
}

Perbedaan utamanya adalah: HttpConfiguration baru () daripada GlobalConfiguration.Configuration.


12
2017-08-11 20:24



Ternyata itu

return Json(result);

adalah pelakunya, menyebabkan proses serialisasi untuk mengabaikan pengaturan camelcase. Dan itu

return Request.CreateResponse(HttpStatusCode.OK, result, Request.GetConfiguration());

adalah droid yang saya cari.

Juga

json.UseDataContractJsonSerializer = true;

Apakah meletakkan kunci pas dalam pekerjaan dan ternyata TIDAK droid yang saya cari.


11
2018-02-17 01:33



Kode WebApiConfig:

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            //This line sets json serializer's ContractResolver to CamelCasePropertyNamesContractResolver, 
            //  so API will return json using camel case
            config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

        }
    }


Pastikan Metode Aksi API Anda mengembalikan data dengan cara berikut dan Anda telah menginstal versi terbaru Json.Net/Newtonsoft.Json Terpasang:

    [HttpGet]
    public HttpResponseMessage List()
    {
        try
        {
            var result = /*write code to fetch your result*/;
            return Request.CreateResponse(HttpStatusCode.OK, cruises);
        }
        catch (Exception ex)
        {
            return Request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message);
        }
    }

6
2017-12-20 11:16



Di Owin Startup Anda, tambahkan baris ini ...

 public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var webApiConfiguration = ConfigureWebApi();            
        app.UseWebApi(webApiConfiguration);
    }

    private HttpConfiguration ConfigureWebApi()
    {
        var config = new HttpConfiguration();

        // ADD THIS LINE HERE AND DONE
        config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 

        config.MapHttpAttributeRoutes();
        return config;
    }
}

4
2017-11-05 13:27



Berikut ini adalah salah satu yang tidak jelas, ketika atribut rute tidak cocok dengan url GET, tetapi url GET mencocokkan nama metode, perintah unta jsonserializer akan diabaikan, mis.

http: // website / api / geo / geodata

//uppercase fail cakes
[HttpGet]
[Route("countries")]
public async Task<GeoData> GeoData()
{
    return await geoService.GetGeoData();
}

//lowercase nomnomnom cakes
[HttpGet]
[Route("geodata")]
public async Task<GeoData> GeoData()
{
    return await geoService.GetGeoData();
}

3
2018-02-11 12:44



Saya telah memecahkannya dengan cara-cara berikut.

[AllowAnonymous]
[HttpGet()]
public HttpResponseMessage GetAllItems(int moduleId)
{
    HttpConfiguration config = new HttpConfiguration();
            config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            config.Formatters.JsonFormatter.UseDataContractJsonSerializer = false;

            try
            {
                List<ItemInfo> itemList = GetItemsFromDatabase(moduleId);
                return Request.CreateResponse(HttpStatusCode.OK, itemList, config);
            }
            catch (System.Exception ex)
            {
                return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex.Message);
            }
}

1
2018-04-04 08:18



Saya menggunakan WebApi dengan Breeze dan saya menjalankan masalah yang sama ketika mencoba untuk mengeksekusi aksi non-angin ke pengendali angin. Saya mencoba menggunakan Permintaan apprach.GetConfiguration tetapi hasilnya sama. Jadi, ketika saya mengakses objek yang dikembalikan oleh Request.GetConfiguration saya menyadari bahwa serializer yang digunakan oleh permintaan adalah yang digunakan server-angin untuk membuat sihirnya. Bagaimanapun, saya menyelesaikan masalah saya membuat HttpConfiguration yang berbeda:

public static HttpConfiguration BreezeControllerCamelCase
        {
            get
            {
                var config = new HttpConfiguration();
                var jsonSerializerSettings = config.Formatters.JsonFormatter.SerializerSettings;
                jsonSerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
                jsonSerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
                config.Formatters.JsonFormatter.UseDataContractJsonSerializer = false;

                return config;
            }
        }

dan mengirimkannya sebagai parameter di Request.CreateResponse sebagai berikut:

return this.Request.CreateResponse(HttpStatusCode.OK, result, WebApiHelper.BreezeControllerCamelCase);

0
2018-05-31 21:51