ABP 입문 시리즈 의 JSon 포맷

10827 단어 abpjson입문 하 다
페이지 기능 을 다 말 했 으 니,이 절 에서 우 리 는 먼저 새로운 기능 을 급히 실현 하지 않 을 것 이다.Abp 에서 제 이 슨 의 용법 을 간략하게 소개 하 겠 습 니 다.왜 이 절 에서 말 해 야 합 니까?당연히 밑받침 을 해 야 지.뒤의 시 리 즈 는 제 이 슨 이라는 물건 과 자주 접촉 할 거 야.
1.제 이 슨 은 뭐 하 는 사람 이에 요?
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 Mvc 의 JSonResult
Asp.net mvc 에 서 는 기본적으로 JSonResult 를 제공 하여 JSon 형식 데 이 터 를 되 돌려 야 하 는 상황 을 처리 합 니 다.
일반적으로 우 리 는 이렇게 사용 할 수 있다.

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)\/"
 }
]
돌아 온 제 이 슨 결 과 를 자세히 살 펴 보면 다음 과 같은 몇 가지 부족 한 점 이 있다.
되 돌아 오 는 필드 의 대소 문 자 는 코드 와 일치 합 니 다.이 는 전단 에서 도 코드 와 일치 하 는 대소 문자 로 값 을 추출 해 야 합 니 다(item.Title,item.Genre,item.ReleaseDate).
성공 실패 정 보 는 포함 되 지 않 습 니 다.요청 이 성 공 했 는 지 판단 하려 면 json 패 킷 의 length 를 수 동 으로 가 져 와 야 합 니 다.
돌아 오 는 날 짜 는 포맷 되 지 않 았 습 니 다.전단 에서 출력 을 자체 포맷 해 야 합 니 다.
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 에서 콘 트 롤 러 로 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
}
그 중에서 result 는 코드 에서 되 돌아 오 는 데 이 터 를 지정 합 니 다.다른 키 쌍 은 ABP 로 봉 인 된 것 으로 인증 여부,성공 여부,오류 정보,목표 Url 을 포함 합 니 다.이 몇 개의 매개 변 수 는 매우 sweet 하지 않 습 니까?
return AbpJSon()을 호출 하여 인 자 를 지정 하여 json 포맷 출력 을 할 수도 있 습 니 다.
자세히 살 펴 보면 날짜 형식 이 이상 하 다.2017-01-23T 00:00:00 에 T 가 하나 더 생 겼 어 요.AbpJSonReult 소스 코드 를 보 니 Newtonsoft.JSon 직렬 화 구성 요소 의 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 을 지정 하지 않 았 습 니 다.그러면 우 리 는 스스로 시작 할 수 밖 에 없습니다.구체 적 인 코드 는 참고 하 십시오json 날짜 형식 문 제 를 해결 하 는 네 번 째 방법
이상 이 발생 했 을 때,Abp 가 되 돌아 오 는 JSon 포맷 출력 은 다음 과 같 습 니 다.

{
 "targetUrl": null,
 "result": null,
 "success": false,
 "error": {
 "message": "An internal error occured during your request!",
 "details": "..."
 },
 "unAuthorizedRequest": false
}
abp 가 필요 없 이 제 이 슨 에 게 소 포 를 포장 하면 어떻게 합 니까?
간단 하 다방법 에[Dont Wrap Result]특성 만 표시 하면 됩 니 다.이 기능 은 사실 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 필터 에 서 는 Wrap ResultAttribute,Dont Wrap ResultAttribute 특성 에 따라 필터 링 을 합 니 다.
4.JSon 날짜 포맷
첫 번 째 방법:전단 JS 변환:

 //     json    
 function showDate(jsonDate) {
  var date = new Date(jsonDate);
  var formatDate = date.toDateString();
  return formatDate;
 }
두 번 째 방법:Abp 의 WepApi Module(모듈)에서 JSonFormatter 의 시간 서열 화 시간 형식 을 지정 합 니 다.

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.DateFormatString ="yyyy-MM-dd HH:mm:ss";
PS:이 방법 은 WebApi 에 만 유효 합 니 다.
총결산
이 절 은 주로 다음 과 같은 몇 가지 문 제 를 설명 했다.
Asp.net 에서 JSonResult 의 실현.
ABP 는 JSonResult 의 재 패 키 징 을 지원 합 니 다.지정 한 크기 의 낙타 봉 과 들 여 쓰기 여 부 를 JSon 포맷 할 수 있 습 니 다.
DateTime 형식의 대상 을 포맷 하여 출력 하 는 방법 입 니 다.
웹 층 은 AbpJSonResult 를 확장 하여 시간 형식 을 지정 합 니 다.
전단,JSon 날 짜 를 js 의 Date 형식 으로 변환 한 다음 출력 을 포맷 합 니 다.
WebApi,Moduel 에서 DateFormattString 을 지정 합 니 다.
위 에서 말 한 것 은 편집장 님 께 서 소개 해 주신 ABP 입문 시리즈 의 JSon 포맷 입 니 다.여러분 께 도움 이 되 셨 으 면 합 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기