Maison > développement back-end > Tutoriel C#.Net > Introduction à l'utilisation du formatage Json dans la série d'introduction ABP

Introduction à l'utilisation du formatage Json dans la série d'introduction ABP

高洛峰
Libérer: 2017-03-19 10:27:43
original
2505 Les gens l'ont consulté

, JSON (JavaScript Object Notation) est un format d'échange de données léger. Cet article se concentre sur l'introduction du formatage Json dans la série d'introduction ABP. Les amis qui en ont besoin peuvent se référer à

Après avoir parlé de la fonction de pagination, nous ne sommes pas pressés d'implémenter de nouvelles fonctions dans cette section. Présentons brièvement l'utilisation de Json dans Abp. Pourquoi en parle-t-on dans cette section ? Bien sûr, il s’agit d’ouvrir la voie. La série d’articles suivante traitera souvent de Json.

1. Que fait Json

JSON (Javascript Object Notation) est un format d'échange de données léger. Facile à lire et à écrire pour les humains. Il est également facile à analyser et à générer pour les machines. JSON utilise un format de texte totalement indépendant du langage, mais utilise également des conventions similaires à la famille du langage C (notamment C, C, C#, Java, Javascript, Perl, Python, etc.). Ces propriétés font de JSON un langage d'échange de données idéal.

Json est généralement utilisé pour représenter :

paire nom/valeur :

{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"}
Copier après la connexion

tableau :

{ "people":[
  {"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"},
  {"firstName":"Jason","lastName":"Hunter","email":"bbbb"},
  {"firstName":"Elliotte","lastName":"Harold","email":"cccc"}
 ]
}
Copier après la connexion

Deuxièmement, JsonResult dans Asp.net Mvc

Asp.net mvc fournit JsonResult par défaut pour gérer les situations dans lesquelles les données au format Json doivent être revenu.

Généralement, nous pouvons l'utiliser comme ceci :

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);
}
Copier après la connexion

où Json() est la méthode virtuelle fournie dans la classe de base Controller.

Le résultat json renvoyé est formaté comme :

[
 {
 "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)\/"
 }
]
Copier après la connexion

En regardant attentivement le résultat json renvoyé, il y a les lacunes suivantes :

Le cas et le code du champ renvoyé In accord. Cela nous oblige à utiliser la même casse dans le front-end que dans le code (item.Title, item.Genre, item.ReleaseDate).

ne contient pas d'informations de réussite ou d'échec : si nous voulons déterminer si la requête est réussie, nous devons obtenir manuellement la longueur du paquet de données json.

La date renvoyée n'est pas formatée et doit être formatée et affichée sur le front-end.

3. Encapsulation de Json dans Abp

Donc Abp encapsule AbpJsonResult hérite de JsonResult, ce qui ajoute principalement deux attributs :

CamelCase : taille du boîtier camel (la valeur par défaut est true, c'est-à-dire le format petit boîtier camel)

Indenté : s'il faut mettre en retrait (la valeur par défaut est false, c'est-à-dire non formaté)

Et surchargé la méthode Json() du Controller dans AbpController, forçant toutes les données au format Json renvoyées à être de type AbpJsonResult et fournissant une méthode virtuelle d'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
 };
}
Copier après la connexion

Dans ABP, utilisez Controller pour hériter d'AbpController, utilisez return Json() directement et formatez le résultat Json renvoyé :

{
 "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
}
Copier après la connexion

où result est le retour spécifié dans le données de code. Plusieurs autres paires clé-valeur sont encapsulées par ABP, notamment l'authentification, la réussite, les informations sur les erreurs et l'URL cible. Ces paramètres sont-ils très doux ?

Vous pouvez également spécifier des paramètres pour la sortie au format json en appelant return AbpJson().

Si vous regardez attentivement, vous constaterez que le format de la date est toujours bizarre. 2017-01-23T00:00:00, encore un T. En examinant le code source d'AbpJsonReult, nous avons constaté que JsonConvert.SerializeObject(obj, settings); dans le composant Newtonsoft.Json Serialization est appelé pour la sérialisation.

Vérifiez l'introduction du site officiel de Newtonsoft.Json Pour la sortie du formatage de la date, vous devez spécifier le DateTimeFormat d'IsoDateTimeConverter.

IsoDateTimeConverter timeFormat = new IsoDateTimeConverter();
   timeFormat.DateTimeFormat = "yyyy-MM-dd HH:mm:ss";
JsonConvert.SerializeObject(dt, Formatting.Indented, timeFormat)
Copier après la connexion

Alors comment spécifier ce DateTimeFormat dans notre Abp ?

La classe AbpDateTimeConverter fournie dans ABP hérite d'IsoDateTimeConverter.

Mais regardez la classe d'extension de sérialisation Json intégrée dans ABP :

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);
 }
 }
Copier après la connexion

Évidemment, DateTimeFormat n'est pas spécifié, nous ne pouvons donc le faire que nous-mêmes. Pour des codes spécifiques, veuillez vous référer à 4 façons. pour résoudre json date La quatrième méthode pour résoudre le problème de format.

当有异常发生时,Abp返回的Json格式化输出以下结果:

{
 "targetUrl": null,
 "result": null,
 "success": false,
 "error": {
 "message": "An internal error occured during your request!",
 "details": "..."
 },
 "unAuthorizedRequest": false
}
Copier après la connexion

当不需要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;
  }
 }
}
Copier après la connexion

在AbpResultFilter和AbpExceptionFilter过滤器中会根据WrapResultAttribute、DontWrapResultAttribute特性进行相应的过滤。

四、Json日期格式化

第一种办法:前端JS转换:

 //格式化显示json日期格式
 function showDate(jsonDate) {
  var date = new Date(jsonDate);
  var formatDate = date.toDateString();
  return formatDate;
 }
Copier après la connexion

第二种办法:在Abp的WepApiModule(模块)中指定JsonFormatter的时间序列化时间格式。

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.DateFormatString ="yyyy-MM-dd HH:mm:ss";
Copier après la connexion

PS:这种方法仅对WebApi有效。

总结

本节主要讲解了以下几个问题:

Asp.net中JsonResult的实现。

ABP对JsonResult的再封装,支持指定大小驼峰及是否缩进进行Json格式化。

如何对DateTime类型对象进行格式化输出。

Web层通过拓展AbpJsonResult,指定时间格式。

前端,通过将Json日期转换为js的Date类型,再格式化输出。

WebApi,通过在Moduel中指定DateFormatString。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal