目录

介绍

JSON示例

MVC

Web API

添加设置

枚举

引用循环

引用$ id / $ ref

TimeZone和DateTime


配置JSON序列化设置

  • 下载源文件 - 764.5 KB

介绍

在ASP.NET MVC项目中生成JSON时,我发现生成的JSON响应实际上不是驼峰格式。还有:

  • JSON没有缩进
  • 序列化单个null值时出现异常
  • 引用循环属性的异常

今天,我将分享如何使用Newtonsoft.Json并在不同类型的项目中配置JSON序列化设置。

JSON示例

MVC

使用驼峰格式JSON 的自定义JsonResult类:

using System;
using System.Text;
using System.Web;
using System.Web.Mvc;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
public class JsonCamelCaseResult : JsonResult
{public Encoding ContentEncoding { get; set; }public string ContentType { get; set; }public object Data { get; set; }private const string HttpMethod = "GET";private const string DefaultContentType = "application/json";public override void ExecuteResult(ControllerContext context){if (context == null){throw new ArgumentNullException(nameof(context));}if (JsonRequestBehavior == JsonRequestBehavior.DenyGet && String.Equals(context.HttpContext.Request.HttpMethod, HttpMethod, StringComparison.OrdinalIgnoreCase)){throw new InvalidOperationException("HttpMethod 'GET' is not allowed");}HttpResponseBase response = context.HttpContext.Response;response.ContentType = string.IsNullOrEmpty(ContentType) ? DefaultContentType : ContentType;if (ContentEncoding != null){response.ContentEncoding = ContentEncoding;}var jsonSerializerSettings = new JsonSerializerSettings{ContractResolver = new CamelCasePropertyNamesContractResolver(),Formatting = Formatting.Indented,ReferenceLoopHandling = ReferenceLoopHandling.Ignore,PreserveReferencesHandling = PreserveReferencesHandling.None    /*prevent $id/$ref at client end*/};response.Write(JsonConvert.SerializeObject(Data, jsonSerializerSettings));}
}

JSON帮助类:

public class CamelJsonHelper
{public JsonCamelCaseResult Json(object data){return new JsonCamelCaseResult{Data = data,JsonRequestBehavior = JsonRequestBehavior.AllowGet};}
}

添加一个新方法到Controller或BaseController 以使用此帮助类:

/*hide base*/
//public new JsonResult Json(object value)
//{
//    return new CamelJsonHelper().Json(value);
//}/*new method*/
public JsonResult JsonCamel(object value)
{return new CamelJsonHelper().Json(value);
}

对于MVC项目,没有全局设置选项。

Web表单

Global.asax.cs添加序列化设置。

/*comment and see the regular serialization*/
JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{ContractResolver = new CamelCasePropertyNamesContractResolver(),Formatting = Formatting.Indented,ReferenceLoopHandling = ReferenceLoopHandling.Ignore,PreserveReferencesHandling = PreserveReferencesHandling.None    /*prevent $id/$ref at client end*/
};

现在序列化对象,如下:

string json = JsonConvert.SerializeObject(DataProvider.Hierarchy())

这也适用于AspxRazorC!!!

如果我们不想在全局范围内配置它,我们可以这样做:

var settings = new JsonSerializerSettings
{ContractResolver = new CamelCasePropertyNamesContractResolver(),Formatting = Formatting.Indented,ReferenceLoopHandling = ReferenceLoopHandling.Ignore,PreserveReferencesHandling = PreserveReferencesHandling.None    /*prevent $id/$ref at client end*/
};
var data = DataProvider.Hierarchy();string json = JsonConvert.SerializeObject(data, settings);

Web API

将新配置类添加到App_Start

public class ResponseSerializerConfig
{public static void Register(HttpConfiguration configuration){JsonResponse(configuration);XmlResponse(configuration);}private static void XmlResponse(HttpConfiguration config){config.Formatters.Remove(config.Formatters.XmlFormatter);}private static void JsonResponse(HttpConfiguration config){config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings{ContractResolver = new CamelCasePropertyNamesContractResolver(),Formatting = Formatting.Indented,ReferenceLoopHandling = ReferenceLoopHandling.Ignore,PreserveReferencesHandling = PreserveReferencesHandling.None    /*prevent $id/$ref at client end*/};}
}

Global.asax.cs应用此配置类。

ResponseSerializerConfig.Register(GlobalConfiguration.Configuration);

添加设置

枚举

{"Enum":"Hello"} 而不是 {"Enum":0}

Converters = new List<JsonConverter> { new StringEnumConverter() }

引用循环

ReferenceLoopHandling = ReferenceLoopHandling.Serialize

引用$ id / $ ref

/*PreserveReferencesHandling.Objects is more popular*/
PreserveReferencesHandling = PreserveReferencesHandling.All;

在js客户端要管理$id/ $ref,请检查:

  • https://gist.github.com/kolodny/8043084
  • https://stackoverflow.com/questions/15312529/resolve-circular-references-from-json-object

TimeZone和DateTime

DateTimeZoneHandling = DateTimeZoneHandling.Utc,
DateFormatHandling = DateFormatHandling.IsoDateFormat

本文将帮助您快速启动项目,将JSON序列化程序设置最小化。请检查附带的VS2017示例项目。

原文地址:https://www.codeproject.com/Tips/1276364/camelCase-JSON-response-in-ASP-NET-projects

ASP.NET项目中的驼峰格式JSON响应相关推荐

  1. UltraWebGrid控件在开发ASP.NET项目中的使用方法和技巧(转)

    摘  要 本文主要阐述了UltraWebGrid 2005控件在实际项目开发中的应用,这里以大庆石化公司炼油厂生产调度系统为例详细描述了UltraWebGrid控件的原理以及它的使用方法和技巧,还特别 ...

  2. 4 angular 重构 项目_c# – 将Angular 4添加到ASP.NETCore项目中

    我想在Visual Studio 2017中的ASP.NetCore 1.1项目中使用Angular 4(读作:* .csproj文件) 以前使用ASP.NET Core 1.0和Visual Stu ...

  3. 在ASP.NET项目中使用CKEditor +CKFinder实现图片上传功能

    前言 之前的项目中一直使用的是FCKeditor,昨天突然有个想法:为什么不试一下新的CKEditor呢?于是花了大半天的时间去学习它的用法,现在把我的学习过程与大家分享一下. 谈起FCKeditor ...

  4. 第一次在Vue项目中播放m3u8格式视频遇到的问题和解决方法

    一.m3u8文件 第一次接触这种m3u8格式的视频文件,开始以为类似与.mp4这种,所以在项目中我通过html5提供的video标签做播放功能发现并不能成功,后来了解到M3U8文件是一种UTF-8编码 ...

  5. Asp.Net项目中.sln文件及.suo文件的作用

    Visual Studio Asp.Net项目下采用两种文件类型(.sln和.suo)来存储特定于解决方案的设置,它们总称为解决方案文件.为解决方案资源管理器提供显示管理文件的图形接口所需的信息,从而 ...

  6. vue项目中,amr格式的音频播放

    在vue项目中,使用电脑浏览器播放amr格式的音频文件是直接播放不出来的,需要使用一个js包:benz-amr-recorder 1.npm install benz-amr-recorder 2.想 ...

  7. 在ASP.NET项目中使用XPO的最佳准则

    学习XPO有一段时间了,也用它陆续做过几个项目.遇到过问题走过弯路,这里把DevExpress知识库的几篇文章的内容做了摘录和整理,并且加上了一些自己的注释,方便自己日后备忘也方便其他的朋友. 1. ...

  8. .NET Core类库项目中如何读取appsettings.json中的配置

    这是一位朋友问我的问题,写篇随笔回答一下.有2种方法,一种叫丑陋的方法 -- IConfiguration ,一种叫优雅的方法 -- IOptions . 1)先看丑陋的方法 比如在 RedisCli ...

  9. 阿里巴巴矢量图标库项目中使用svg格式字体图标使用方式及封装

    一.首先登陆阿里云矢量图标库,把需要的字体图标加入到自己的项目中 二.阿里云图标的四种方式(推荐第三种方式引入,如果不考虑网络问题可以用在线引入的方式) 进入项目以后会看到阿里云可以选择三种方式进行导 ...

最新文章

  1. 【tensorboard】从tensorboard上看出模型是否存在过拟合
  2. C#+WebSocket+WebRTC多人语音视频系统
  3. Scrapy基本用法
  4. centos7 python3 sqlserver_Centos7.3下SQLServer安装配置方法图文教程
  5. 三十一、电子商务分析与服务推荐
  6. iOS和android的屏幕适配
  7. python返回变量类型_Python指定函数参数、返回值类型报错是咋了?
  8. 基于单片机的电集中抄表设计
  9. Unity CityEngine 根据地图中建筑矢量数据批量建模
  10. php手册经常见到,什么是“二进制安全”?
  11. Paul叔纯正美式发音②~发音技巧(二)
  12. html中用js格式化JSON输出
  13. PS学习(一)-改变logo颜色
  14. 解决IDEA 前端返回值乱码问题
  15. MS切面时surface mesh设置小数提示错误解决方案
  16. 2020年3月22日总结
  17. 计算机工资高的岗位,毕业五年后工资最高的4大专业,就业容易岗位多
  18. 基于Python机器学习对某地区房地产数据分析预测报告
  19. DFS(Depth First Search,深度优先搜索)与BFS(Breadth First Search,广度优先搜索)总结与思考
  20. Python数据分析师特训营全套课程

热门文章

  1. 7z001怎么解压在安卓手机上面_安卓zip文件压缩RAR解压手机下载-安卓zip文件压缩RAR解压v1.0最新版下载...
  2. 查看目录是否为内存盘_CentOS系列002:挂载数据盘
  3. UI设计师如何正确打开暗黑模式|实用素材拿走
  4. 一流设计师导航|16map,一款强大且智能的设计师导航网站
  5. 流量 起伏大_广西崇左的德天跨国大瀑布,一半是中国一半是越南,天下奇观!...
  6. C++ 输出数据类型
  7. Linux内核:内存从BIOS->e820->memblock->node/zone基本流程
  8. Linux Zero-copy零拷贝技术:源码示例
  9. Linux内存管理:分页
  10. 基于GitHub创建自己的个人网站