, JSON(JavaScript 객체 표기법)은 경량 데이터 교환 형식입니다. 이 글은 ABP 입문 시리즈에서 Json 형식을 소개하는 데 초점을 맞췄습니다. 필요한 친구들은
을 참조하세요. 페이징 기능에 대해 이야기한 후 이 섹션에서는 서두르지 않고 새로운 기능을 구현합니다. Abp에서 Json의 사용법을 간략하게 소개하겠습니다. 이 섹션에서 이에 대해 이야기하는 이유는 무엇입니까? 물론 이는 길을 닦기 위한 것입니다. 다음 기사 시리즈에서는 Json을 다루는 경우가 많습니다.
1. Json은 무엇을 하나요?
JSON(Javascript Object Notation)은 경량 데이터 교환 형식입니다. 인간이 읽고 쓰기가 쉽습니다. 기계가 구문 분석하고 생성하는 것도 쉽습니다. JSON은 완전히 언어 독립적인 텍스트 형식을 사용하지만 C 언어 계열(C, C++, C#, Java, Javascript, Perl, Python 등). 이러한 속성은 JSON을 이상적인 데이터 교환 언어로 만듭니다.
Json은 일반적으로 다음을 나타내는 데 사용됩니다. 이름/값 쌍:{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"}
{ "people":[ {"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"}, {"firstName":"Jason","lastName":"Hunter","email":"bbbb"}, {"firstName":"Elliotte","lastName":"Harold","email":"cccc"} ] }
public ActionResult Movies() { var movies = new List<object>(); movies.Add(new { Title = "Ghostbusters", Genre = "Comedy", ReleaseDate = new DateTime(2017,1,1) }); movies.Add(new { Title = "Gone with Wind", Genre = "Drama", ReleaseDate = new DateTime(2017, 1, 3) }); movies.Add(new { Title = "Star Wars", Genre = "Science Fiction", ReleaseDate = new DateTime(2017, 1, 23) }); return Json(movies, JsonRequestBehavior.AllowGet); }
[ { "Title": "Ghostbusters", "Genre": "Comedy", "ReleaseDate": "\/Date(1483200000000)\/" }, { "Title": "Gone with Wind", "Genre": "Drama", "ReleaseDate": "\/Date(1483372800000)\/" }, { "Title": "Star Wars", "Genre": "Science Fiction", "ReleaseDate": "\/Date(1485100800000)\/" } ]
형식을 지정하여 출력해야 합니다.
3. Abp에서 Json 캡슐화
Abp는 AbpJsonResult를 캡슐화합니다.는 주로 두 가지 속성을 추가하는 JsonResult에서 를 상속합니다. :
CamelCase: 크기 카멜 케이스(기본값은 true, 즉 작은 카멜 케이스 형식) Indented: 들여쓰기 여부(기본값은 false, 즉 형식화되지 않음)그리고 AbpController에 있는 Controller의 Json() 메서드를
오버로드하여 반환된 모든 Json 형식 데이터를 AbpJsonResult 유형으로 강제하고 AbpJson()의 가상 메서드를 제공합니다.
/// <summary> /// Json the specified data, contentType, contentEncoding and behavior. /// </summary> /// <param name="data">Data.</param> /// <param name="contentType">Content type.</param> /// <param name="contentEncoding">Content encoding.</param> /// <param name="behavior">Behavior.</param> protected override JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior) { if (_wrapResultAttribute != null && !_wrapResultAttribute.WrapOnSuccess) { return base.Json(data, contentType, contentEncoding, behavior); } return AbpJson(data, contentType, contentEncoding, behavior); } protected virtual AbpJsonResult AbpJson( object data, string contentType = null, Encoding contentEncoding = null, JsonRequestBehavior behavior = JsonRequestBehavior.DenyGet, bool wrapResult = true, bool camelCase = true, bool indented = false) { if (wrapResult) { if (data == null) { data = new AjaxResponse(); } else if (!(data is AjaxResponseBase)) { data = new AjaxResponse(data); } } return new AbpJsonResult { Data = data, ContentType = contentType, ContentEncoding = contentEncoding, JsonRequestBehavior = behavior, CamelCase = camelCase, Indented = indented }; }
{ "result": [ { "title": "Ghostbusters", "genre": "Comedy", "releaseDate": "2017-01-01T00:00:00" }, { "title": "Gone with Wind", "genre": "Drama", "releaseDate": "2017-01-03T00:00:00" }, { "title": "Star Wars", "genre": "Science Fiction", "releaseDate": "2017-01-23T00:00:00" } ], "targetUrl": null, "success": true, "error": null, "unAuthorizedRequest": false, "abp": true }
Json Serialization 구성 요소에서 JsonConvert.SerializeObject(obj, settings);가 직렬화를 위해 호출되는 것을 발견했습니다.
Newtonsoft.Json 공식 홈페이지 소개를 확인하세요. 날짜 형식 출력을 위해서는 IsoDateTimeConverter의 DateTimeFormat을 지정해야 합니다.IsoDateTimeConverter timeFormat = new IsoDateTimeConverter(); timeFormat.DateTimeFormat = "yyyy-MM-dd HH:mm:ss"; JsonConvert.SerializeObject(dt, Formatting.Indented, timeFormat)
public static class JsonExtensions { /// <summary>Converts given object to JSON string.</summary> /// <returns></returns> public static string ToJsonString(this object obj, bool camelCase = false, bool indented = false) { JsonSerializerSettings settings = new JsonSerializerSettings(); if (camelCase) settings.ContractResolver = (IContractResolver) new CamelCasePropertyNamesContractResolver(); if (indented) settings.Formatting = Formatting.Indented; settings.Converters.Insert(0, (JsonConverter) new AbpDateTimeConverter()); return JsonConvert.SerializeObject(obj, settings); } }
当有异常发生时,Abp返回的Json格式化输出以下结果:
{ "targetUrl": null, "result": null, "success": false, "error": { "message": "An internal error occured during your request!", "details": "..." }, "unAuthorizedRequest": false }
当不需要abp对json进行封装包裹怎么办?
简单。只需要在方法上标记[DontWrapResult]特性即可。这个特性其实是一个快捷方式用来告诉ABP不要用AbpJsonResult包裹我,看源码就明白了:
namespace Abp.Web.Models { [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Method)] public class DontWrapResultAttribute : WrapResultAttribute { /// <summary> /// Initializes a new instance of the <see cref="DontWrapResultAttribute"/> class. /// </summary> public DontWrapResultAttribute() : base(false, false) { } } /// <summary> /// Used to determine how ABP should wrap response on the web layer. /// </summary> [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Method)] public class WrapResultAttribute : Attribute { /// <summary> /// Wrap result on success. /// </summary> public bool WrapOnSuccess { get; set; } /// <summary> /// Wrap result on error. /// </summary> public bool WrapOnError { get; set; } /// <summary> /// Log errors. /// Default: true. /// </summary> public bool LogError { get; set; } /// <summary> /// Initializes a new instance of the <see cref="WrapResultAttribute"/> class. /// </summary> /// <param name="wrapOnSuccess">Wrap result on success.</param> /// <param name="wrapOnError">Wrap result on error.</param> public WrapResultAttribute(bool wrapOnSuccess = true, bool wrapOnError = true) { WrapOnSuccess = wrapOnSuccess; WrapOnError = wrapOnError; LogError = true; } } }
在AbpResultFilter和AbpExceptionFilter过滤器中会根据WrapResultAttribute、DontWrapResultAttribute特性进行相应的过滤。
四、Json日期格式化
第一种办法:前端JS转换:
//格式化显示json日期格式 function showDate(jsonDate) { var date = new Date(jsonDate); var formatDate = date.toDateString(); return formatDate; }
第二种办法:在Abp的WepApiModule(模块)中指定JsonFormatter的时间序列化时间格式。
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.DateFormatString ="yyyy-MM-dd HH:mm:ss";
PS:这种方法仅对WebApi有效。
总结
本节主要讲解了以下几个问题:
Asp.net中JsonResult的实现。
ABP对JsonResult的再封装,支持指定大小驼峰及是否缩进进行Json格式化。
如何对DateTime类型对象进行格式化输出。
Web层通过拓展AbpJsonResult,指定时间格式。
前端,通过将Json日期转换为js的Date类型,再格式化输出。
WebApi,通过在Moduel中指定DateFormatString。
위 내용은 ABP 입문 시리즈의 Json 형식 지정 사용법 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!