ASP.NET MVC 컨트롤러 메소드에서 JSON.NET으로 직렬화 된 camelCase JSON을 어떻게 반환 할 수 있습니까?
내 문제는 JSON.NET으로 직렬화 된 ASP.NET MVC 컨트롤러 메소드의 ActionResult 를 통해 camelCased (표준 PascalCase와 달리) JSON 데이터를 반환하려는 것 입니다.
예를 들어 다음 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.NET을 통해 데이터를 직렬화하여 camelCase 규칙을 따르도록 구성하는 ActionResult의 서브 클래스를 작성하는 것입니다.
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으로 직렬화하는 확장 메소드를 작성하는 것입니다.
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");
ASP.NET Core MVC에서.
public IActionResult Foo()
{
var data = GetData();
var settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
});
return Json(data, settings);
}
다음은 객체 배열을 직렬화하여 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 인스턴스가 두 번째 매개 변수로 전달되었습니다. 그것이 camelCase가 일어나는 이유입니다.
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
};
}
}
나는 이것을 좋아했다 :
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이 될 수 있어야합니다.
'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()
};
}
'IT story' 카테고리의 다른 글
enum 값을 int로 변환하는 방법? (0) | 2020.04.22 |
---|---|
ASP.NET Core 웹 API 예외 처리 (0) | 2020.04.22 |
JS로 HTML 문자열 구문 분석 (0) | 2020.04.22 |
Moq를 사용하여 처음과 두 번째에 다른 반환 값 (0) | 2020.04.22 |
새 응용 프로그램을 작성할 때 사용할 레일 버전 지정 (0) | 2020.04.22 |