programing

JSON에 의해 시리얼화된 camel Case JSON을 반환하려면 어떻게 해야 합니까?ASP로부터의 NET.NET MVC 컨트롤러 방식

codeshow 2023. 3. 18. 09:11
반응형

JSON에 의해 시리얼화된 camel Case JSON을 반환하려면 어떻게 해야 합니까?ASP로부터의 NET.NET MVC 컨트롤러 방식

문제는 ASP에서 ActionResults를 통해 camelCased(표준 PascalCase가 아닌) JSON 데이터를 반환하고 싶다는 것입니다.JSON에 의해 시리얼화된 NET MVC 컨트롤러 방식.네트워크

예를 들어 다음 C# 클래스를 고려합니다.

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

기본적으로는 MVC 컨트롤러에서 이 클래스의 인스턴스를 JSON으로 반환하면 다음과 같은 방식으로 직렬화됩니다.

{
  "FirstName": "Joe",
  "LastName": "Public"
}

(JSON에 의해) 연재를 희망하고 있습니다.NET) :

{
  "firstName": "Joe",
  "lastName": "Public"
}

이거 어떻게 해?

간단히 말하면 다음과 같습니다.

JsonConvert.SerializeObject(
    <YOUR OBJECT>, 
    new JsonSerializerSettings 
    { 
        ContractResolver = new CamelCasePropertyNamesContractResolver() 
    });

예:

return new ContentResult
{
    ContentType = "application/json",
    Content = JsonConvert.SerializeObject(new { content = result, rows = dto }, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }),
    ContentEncoding = Encoding.UTF8
};

나는 이 문제에 대한 훌륭한 해결책을 Mats Karlsson의 블로그에서 찾았습니다.솔루션은 JSON을 통해 데이터를 시리얼화하는 ActionResult 서브클래스를 작성하는 것입니다.NET, camel Case 표기법에 따르도록 후자를 설정합니다.

public class JsonCamelCaseResult : ActionResult
{
    public JsonCamelCaseResult(object data, JsonRequestBehavior jsonRequestBehavior)
    {
        Data = data;
        JsonRequestBehavior = jsonRequestBehavior;
    }

    public Encoding ContentEncoding { get; set; }

    public string ContentType { get; set; }

    public object Data { get; set; }

    public JsonRequestBehavior JsonRequestBehavior { get; set; }

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }
        if (JsonRequestBehavior == JsonRequestBehavior.DenyGet && String.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
        {
            throw new InvalidOperationException("This request has been blocked because sensitive information could be disclosed to third party web sites when this is used in a GET request. To allow GET requests, set JsonRequestBehavior to AllowGet.");
        }

        var response = context.HttpContext.Response;

        response.ContentType = !String.IsNullOrEmpty(ContentType) ? ContentType : "application/json";
        if (ContentEncoding != null)
        {
            response.ContentEncoding = ContentEncoding;
        }
        if (Data == null)
            return;

        var jsonSerializerSettings = new JsonSerializerSettings
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver()
        };
        response.Write(JsonConvert.SerializeObject(Data, jsonSerializerSettings));
    }
}

다음으로 이 클래스를 MVC 컨트롤러 방식으로 사용합니다.

public ActionResult GetPerson()
{
    return new JsonCamelCaseResult(new Person { FirstName = "Joe", LastName = "Public" }, JsonRequestBehavior.AllowGet)};
}

WebAPI 의 경우는, 다음의 링크를 확인해 주세요.http://odetocode.com/blogs/scott/archive/2013/03/25/asp-net-webapi-tip-3-camelcasing-json.aspx

기본적으로, 이 코드를 다음 코드에 추가합니다.Application_Start:

var formatters = GlobalConfiguration.Configuration.Formatters;
var jsonFormatter = formatters.JsonFormatter;
var settings = jsonFormatter.SerializerSettings;
settings.ContractResolver = new CamelCasePropertyNamesContractResolver();

이것이 당신이 찾고 있는 간단한 대답이라고 생각합니다.Shawn Wildermuth의 블로그에서 온 것입니다.

// Add MVC services to the services container.
services.AddMvc()
  .AddJsonOptions(opts =>
  {
    opts.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
  });

Json NamingStrategy 속성을 클래스 정의에 추가합니다.

[JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))]
public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

커스텀 필터 대신 확장 메서드를 생성하여 개체를 JSON으로 시리얼화하는 방법이 있습니다.

public static class ObjectExtensions
{
    /// <summary>Serializes the object to a JSON string.</summary>
    /// <returns>A JSON string representation of the object.</returns>
    public static string ToJson(this object value)
    {
        var settings = new JsonSerializerSettings
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver(),
            Converters = new List<JsonConverter> { new StringEnumConverter() }
        };

        return JsonConvert.SerializeObject(value, settings);
    }
}

그런 다음 컨트롤러 액션에서 돌아오면 호출합니다.

return Content(person.ToJson(), "application/json");

심플할수록 IMO가 좋아!

왜 이렇게 안 해?

public class CourseController : JsonController
{
    public ActionResult ManageCoursesModel()
    {
        return JsonContent(<somedata>);
    }
}

심플한 베이스 클래스

public class JsonController : BaseController
{
    protected ContentResult JsonContent(Object data)
    {
        return new ContentResult
        {
            ContentType = "application/json",
             Content = JsonConvert.SerializeObject(data, new JsonSerializerSettings { 
              ContractResolver = new CamelCasePropertyNamesContractResolver() }),
            ContentEncoding = Encoding.UTF8
        };
    }
}

'Startup.cs' 파일에서 설정을 지정해야 합니다.

또한 JsonConvert 기본값에서도 정의해야 합니다.이거는 나중에 라이브러리를 직접 사용하여 개체를 직렬화하는 경우입니다.

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
            .AddJsonOptions(options => {
                options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
                options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            });
        JsonConvert.DefaultSettings = () => new JsonSerializerSettings
        {
            NullValueHandling = NullValueHandling.Ignore,
            ContractResolver = new CamelCasePropertyNamesContractResolver()
        };
    }

오브젝트 배열을 시리얼화하여 json 문자열(cameCase)을 반환하는 액션 메서드를 다음에 나타냅니다.

public string GetSerializedCourseVms()
    {
        var courses = new[]
        {
            new CourseVm{Number = "CREA101", Name = "Care of Magical Creatures", Instructor ="Rubeus Hagrid"},
            new CourseVm{Number = "DARK502", Name = "Defence against dark arts", Instructor ="Severus Snape"},
            new CourseVm{Number = "TRAN201", Name = "Transfiguration", Instructor ="Minerva McGonal"}
        };
        var camelCaseFormatter = new JsonSerializerSettings();
        camelCaseFormatter.ContractResolver = new CamelCasePropertyNamesContractResolver();
        return JsonConvert.SerializeObject(courses, camelCaseFormatter);
    }

두 번째 파라미터로 전달된 JsonSerializerSettings 인스턴스에 주의하십시오.그게 카멜 케이스가 일어난 이유야

ASP.NET 코어 MVC에서

    public IActionResult Foo()
    {
        var data = GetData();

        var settings = new JsonSerializerSettings 
        { 
            ContractResolver = new CamelCasePropertyNamesContractResolver() 
        });

        return Json(data, settings);
    }

저는 이렇게 했어요.

public static class JsonExtension
{
    public static string ToJson(this object value)
    {
        var settings = new JsonSerializerSettings
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver(),
            NullValueHandling = NullValueHandling.Ignore,
            ReferenceLoopHandling = ReferenceLoopHandling.Serialize
        };
        return JsonConvert.SerializeObject(value, settings);
    }
}

이것은 MVC 코어의 단순한 확장 메서드로, 프로젝트의 모든 오브젝트에 ToJson() 기능을 부여합니다.MVC 프로젝트에서는 대부분의 오브젝트가 json이 될 수 있는 기능을 가지고 있어야 합니다.물론 이것은 다음과 같습니다.)

.net core web api에서 ActionResult를 반환하거나 IHtpAction 결과를 반환할 경우 프런트 엔드의 대소문자와 일치하는 Ok() 메서드로 모델을 정리하여 시리얼화할 수 있습니다.JsonConvert는 사용할 필요가 없습니다.:)

Microsoft 의 인스톨 패키지.AspNetCore.MVC. NewtonsoftJson

이것은 나의 문제를 해결한다.

언급URL : https://stackoverflow.com/questions/19445730/how-can-i-return-camelcase-json-serialized-by-json-net-from-asp-net-mvc-controll

반응형