code

MVC 4에서의 적절한 JSON 시리얼화

starcafe 2023. 3. 19. 18:22
반응형

MVC 4에서의 적절한 JSON 시리얼화

JSON을 '적절하게' 시리얼화(camel Case)하고, 필요에 따라 날짜 형식을 변경할 수 있는 기능을 원합니다.

Web API에서는 매우 간단합니다.Global.asax에서는 다음 코드를 실행합니다.

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

파이프라인 수준에서 이 코드는 내가 원하는 방식으로 직렬화를 처리합니다.

MVC 4에서도 같은 작업을 수행하고 싶습니다.컨트롤러 액션 방식에서 반환된 JSON이 올바르게 시리얼화되도록 합니다.검색을 조금 해보니 Global.asax 어플리케이션 부팅 시 다음 코드를 찾을 수 있었습니다.

HttpConfiguration config = GlobalConfiguration.Configuration;
Int32 index = config.Formatters.IndexOf(config.Formatters.JsonFormatter);
config.Formatters[index] = new JsonMediaTypeFormatter
{
     SerializerSettings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }
};

정상적으로 동작하고 있는 것 같습니다만, 컨트롤러에서 JSON을 반송하면 모두 Pascal Cased입니다.액션 방법의 간단한 예를 다음에 나타냅니다.

private JsonResult GetJsonTest()
{
    var returnData = dataLayer.GetSomeObject();
    return Json(returnData, JsonRequestBehavior.AllowGet);
}

제가 잘못 가고 있는 건가요?파이프라인 수준에서 어떻게 이 일을 해낼지 아는가?

ServiceStack이나 Json 등의 사용을 권장합니다.MVC 애플리케이션에서 Json 출력을 처리하기 위한 NET.그러나 기본 클래스를 사용하여 쉽게 클래스를 작성하고 Json 메서드를 재정의할 수 있습니다.아래 예를 참조하십시오.

메모: Global.ascx.cs 파일에는 아무것도 필요 없습니다.

커스텀 JsonDotNetResult 클래스:

public class JsonDotNetResult : JsonResult
{
    private static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
    {
        ContractResolver = new CamelCasePropertyNamesContractResolver(),
        Converters = new List<JsonConverter> { new StringEnumConverter() }
    };

    public override void ExecuteResult(ControllerContext context)
    {
        if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet &&
            string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
        {
            throw new InvalidOperationException("GET request not allowed");
        }

        var response = context.HttpContext.Response;

        response.ContentType = !string.IsNullOrEmpty(this.ContentType) ? this.ContentType : "application/json";

        if (this.ContentEncoding != null)
        {
            response.ContentEncoding = this.ContentEncoding;
        }

        if (this.Data == null)
        {
            return;
        }

        response.Write(JsonConvert.SerializeObject(this.Data, Settings));
    }
}

기본 컨트롤러 클래스:

public abstract class Controller : System.Web.Mvc.Controller
{
    protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding, JsonRequestBehavior behavior)
    {
        return new JsonDotNetResult
            {
                Data = data,
                ContentType = contentType,
                ContentEncoding = contentEncoding,
                JsonRequestBehavior = behavior
            };
    }
}

이제 컨트롤러 동작으로 이와 같은 것을 반환할 수 있습니다.

return Json(myObject, JsonRequestBehavior.AllowGet);

BAM. 이제 Json과 함께 camelcase 객체가 반환되었습니다:)

메모: Json을 사용하여 작성하는 각 오브젝트의 시리얼라이저 설정을 사용하여 이를 수행할 수 있습니다.하지만 당신이 Json을 돌려주고 싶을 때마다 누가 그걸 타이핑하고 싶어하겠어요?

Web API는 JSON을 사용합니다.NET, MVC4는 기본적으로 JavaScript Serializer를 사용하고 있으며, Camel Case 시리얼라이제이션으로의 변경은 지원하지 않는다고 생각합니다.체크해 주세요.ASP에서 기본 JSON 시리얼라이저를 설정합니다.넷 MVC

여기서 설명하는 대로 JSON을 사용하여 커스텀 JsonNetResult를 작성하는 것이 좋습니다.ASP의 디폴트 JSON 시리얼라이저로서의 NET.NET MVC 3 - 가능합니까?마지막 행을 다음과 같이 변경합니다.

var serializedObject = JsonConvert.SerializeObject(
      Data,
      Formatting.Indented,
      new JsonSerializerSettings { MappingResolver = new CamelCaseMappingResolver() });
Note that below information is for Asp .Net core

.Net 팀은 최근 MVC가 JSON을 기본적으로 camel case 이름으로 시리얼화한다고 발표했습니다.

다음의 몇개의 행으로, 이 기능을 유효하게 할 수 있습니다.

services
.AddMvc()
.AddJsonOptions(options =>
options.SerializerSettings.ContractResolver = new DefaultContractResolver());

나는 여기에 있는 것과 같은 작은 블로그를 썼다.

스태틱 메서드를 생성하여ContentResult를 이용하다NewtonSoft.Json다음과 같은 시리얼화를 실행하는 라이브러리:

public static ContentResult CamelJson<TData>(TData response)
{
    DefaultContractResolver resolver = new CamelCasePropertyNamesContractResolver();
    JsonSerializerSettings settings = new JsonSerializerSettings
    {
        ContractResolver = resolver,
        DateFormatHandling = DateFormatHandling.IsoDateFormat
    };
    return new ContentResult
    {
        Content = JsonConvert.SerializeObject(response, settings),
        ContentType = "application/json"
    };
}

사용 예:

[HttpGet]
public ContentResult GetCamelCaseJsonData()
{
  return ContentUtils.CamelJson(result);
}

출력은 camel-case가 됩니다.

언급URL : https://stackoverflow.com/questions/17244774/proper-json-serialization-in-mvc-4

반응형