ABP 입문 시리즈의 Json 형식 지정 사용법 소개

高洛峰
풀어 주다: 2017-03-19 10:27:43
원래의
2434명이 탐색했습니다.

, 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"}
 ]
}
로그인 후 복사

2. Asp.net의 JsonResult Mvc

Asp.net mvc는 Json 형식 데이터를 반환해야 하는 상황을 처리하기 위해 기본적으로 JsonResult를 제공합니다.

일반적으로 다음과 같이 사용할 수 있습니다.

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);
}
로그인 후 복사
여기서 Json()은 Controller 기본 클래스에서 제공되는 가상 메서드입니다.

반환된 json 결과의 형식은 다음과 같습니다.

[
 {
 "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)\/"
 }
]
로그인 후 복사
반환된 json 결과를 주의 깊게 살펴보면 다음과 같은 단점이 있습니다.

반환된 필드 대소문자가 코드와 일치합니다. . 이를 위해서는 코드(item.Title, item.Genre, item.ReleaseDate)와 마찬가지로 프런트 엔드에서도 동일한 대소문자를 사용해야 합니다.

에는 성공 또는 실패 정보가 포함되어 있지 않습니다. 요청이 성공했는지 확인하려면 json 데이터 패킷의 길이를 수동으로 가져와야 합니다.

반환된 날짜는 형식화되지 않았으며 프런트엔드에서

형식을 지정하여 출력해야 합니다.

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
 };
}
로그인 후 복사
ABP에서는 Controller를 사용하여 AbpController에서 상속하고, return Json()을 직접 사용하고, 반환된 Json 결과의 형식을 지정합니다.

{
 "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
}
로그인 후 복사
여기서 결과는 코드에 지정된 반환 데이터입니다. 인증, 성공, 오류 정보 및 대상 URL을 포함하여 여러 다른 키-값 쌍이 ABP에 의해 캡슐화됩니다. 이 매개 변수는 매우 유용합니까?

return AbpJson()을 호출하여 json 형식 출력에 대한 매개변수를 지정할 수도 있습니다.

자세히 살펴보면 날짜 형식이 여전히 이상한 것을 알 수 있습니다. 2017-01-23T00:00:00, 하나 더 T. AbpJsonReult 소스 코드를 살펴보면 Newtonsoft.

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)
로그인 후 복사
그럼 Abp에서 이 DateTimeFormat을 어떻게 지정합니까?

ABP에서 제공하는 AbpDateTimeConverter 클래스는 IsoDateTimeConverter를 상속합니다.

하지만 ABP에 통합된 Json 직렬화 확장 클래스를 살펴보세요.

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);
 }
 }
로그인 후 복사
분명히 DateTimeFormat이 지정되지 않았으므로 우리가 직접 수행할 수만 있는 특정 코드에 대해서는 4가지 해결 방법을 참조하세요. json 날짜 형식 문제 방법의 네 번째 방법입니다.

当有异常发生时,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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!