皮皮网

【看源码犯困】【软件源码分析】【手机源码大神】asp.net json 源码

时间:2024-11-26 18:52:13 分类:百科 来源:glusterfs 源码

1.ASP.NET Core Web API设置响应输出的源码Json数据格式的两种方式
2.在.NET Web API设置响应输出Json数据格式常用的两种方式
3.Asp.NetCore1.1版本去掉project.json后如何打包生成跨平台包

asp.net json 源码

ASP.NET Core Web API设置响应输出的Json数据格式的两种方式

       在 ASP.NET Core Web API中设置响应输出Json数据格式有两种方式,可以通过添加System.Text.Json或Newtonsoft.JsonJSON序列化和反序列化库在应用程序中全局设置接口响应的源码Json数据格式。本文将展示如何使用这两种库来实现统一格式的源码Json输出。

       ### System.Text.Json

       System.Text.Json是源码 .NET Core 3.0 及以上版本中内置的 JSON 序列化和反序列化库。使用此库可以实现对Json数据的源码高效序列化和反序列化操作。在全局配置中,源码看源码犯困可以通过添加自定义时间输出格式类来实现输出格式的源码自定义。

       ### Newtonsoft.Json

       Newtonsoft.Json是源码一个功能强大且灵活的.NET JSON序列化和反序列化库,用于在.NET应用程序中处理JSON数据。源码在.NET 3.0及其以上的源码版本使用Newtonsoft.Json需要通过安装Microsoft.AspNetCore.Mvc.NewtonsoftJson 包来进行配置。在全局配置中,源码可以调整序列化选项以实现对Json数据的源码格式化输出。

       ### 设置Json统一格式需求

       设置统一的源码Json输出格式需求是为了确保API输出的Json数据在样式和内容上保持一致,提高代码的源码可读性和可维护性。通过全局配置,源码软件源码分析可以简化代码结构,减少重复的序列化逻辑。

       ### 设置示例

       #### System.Text.Json

       在全局配置中添加自定义时间输出格式类(如DateTimeJsonConverter),并在Program.cs文件中全局注册,确保所有序列化操作使用该自定义转换器。

       #### Newtonsoft.Json

       在Program.cs文件中全局配置Microsoft.AspNetCore.Mvc.NewtonsoftJson包,调整序列化选项以适应所需的Json格式输出需求。

       ### 输出示例

       配置后输出的Json数据将遵循所设定的格式规则,无论是使用System.Text.Json还是Newtonsoft.Json库,都确保了输出的Json数据具有统一的外观和结构。

       ### 技术社区交流

       欢迎加入DotNetGuide技术社区微信交流群,与更多开发者共享学习资源、讨论技术问题,共同成长。手机源码大神

在.NET Web API设置响应输出Json数据格式常用的两种方式

       在.NET Core Web API中设置响应输出JSON数据格式,通常采用两种方式:添加System.Text.Json或Newtonsoft.Json序列化与反序列化库。以下内容将通过示例演示如何在ASP.NET Core Web API中使用这两种库来全局设置接口响应的JSON数据格式。注意,本文将基于Minimal API模式进行说明。

       ### System.Text.Json

       System.Text.Json是.NET Core 3.0及以上版本内置的JSON序列化和反序列化库。使用时,无需额外安装包,只需在项目中引用System.Text.Json即可。

       ### Newtonsoft.Json

       Newtonsoft.Json是一个功能强大、灵活的.NET JSON序列化与反序列化库。适用于处理.NET应用程序中的JSON数据,提供丰富的特性以满足不同场景需求。

       ### 需求:设置统一格式的源码的故事API输出JSON数据

       在未配置JSON格式之前,API输出的JSON数据可能未遵循统一格式。为解决此问题,可以针对特定模型或全局设置输出格式。

       #### UserInfoModel示例

       假设存在一个`UserInfoModel`类,包含姓名、年龄等属性。在相应的`UserInfoController`中,通过JSON序列化输出此模型。

       #### 示例代码

       csharp

       public class UserInfoController : ControllerBase

       {

        [HttpGet("users/{ id}")]

        public IActionResult GetUser(int id)

        {

        var user = new UserInfoModel

        {

        Name = "John Doe",

        Age = ,

        // 其他属性...

        };

        return Ok(user);

        }

       }

       ### System.Text.Json程序全局配置

       为实现全局JSON输出格式配置,可以自定义时间输出格式类(例如,`DateTimeJsonConverter`),然后在`Program.cs`文件中全局注册。

       csharp

       public static class JsonConfiguration

       {

        public static void ConfigureJson(this WebApplicationBuilder builder)

        {

        builder.Services.AddControllers(options =>

        {

        options.JsonSerializerOptions.Converters.Add(new DateTimeJsonConverter());

        });

        }

       }

       public class DateTimeJsonConverter : JsonConverter

       {

        public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)

        {

        // 读取时间格式并转换

        return DateTime.Parse(reader.GetString());

        }

        public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)

        {

        // 根据自定义格式输出时间

        writer.WriteStringValue(value.ToString("yyyy-MM-dd HH:mm:ss"));

        }

       }

       ### 配置后输出的JSON数据

       全局配置后,所有控制器的辅助开端源码响应JSON数据将遵循设置的格式。例如,使用自定义时间格式输出。

       ### Newtonsoft.Json程序全局配置说明

       在.NET 3.0及以上版本使用Newtonsoft.Json,需先安装`Microsoft.AspNetCore.Mvc.NewtonsoftJson`包。

       csharp

       public static void ConfigureJson(this WebApplicationBuilder builder)

       {

        builder.Services.AddControllers(options =>

        {

        options.EnableEndpointRouting = false;

        options.Filters.Add(new ProducesAttribute("application/json"));

        options.JsonSerializerOptions.SerializerSettings.ContractResolver = new DefaultContractResolver();

        options.JsonSerializerOptions.PropertyNamingPolicy = null;

        }).AddNewtonsoftJson(options =>

        {

        options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;

        options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;

        options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";

        });

       }

       ### 总结

       通过上述示例和配置方法,可以实现.NET Core Web API中JSON数据格式的全局统一设置。无论是使用内置的System.Text.Json,还是功能丰富的Newtonsoft.Json,都能有效满足API响应输出的格式需求。

Asp.NetCore1.1版本去掉project.json后如何打包生成跨平台包

        本章将要和大家分享的是Asp.NetCore1.1版本去掉了project.json后如何打包生成跨平台包, 为了更好跟进AspNetCore的发展,把之前用来做netcore开发的vs卸载后并安装了vs,这给我带来的直接好处是把我报红的C盘腾出GB左右的空间,从这里直接能感受到vs体积如此之小;之前有写过一篇开源netcore服务的文章开源一个跨平台运行的服务插件 - TaskCore.MainForm,里面有讲述netcore项目生成和部署在win7和ubuntu.系统上的例子,感兴趣的朋友可以去看看;下面开始本文的内容,希望大家能够喜欢,也希望各位多多"扫码支持"和"推荐"谢谢!

       AspNetCore中使用Session(基于MemoryCache组件)

       这节内容看起来有点不符合文章标题,主要是只写生成跨平台包的内容太少,有些朋友觉得干活太少不满意,因此就用这如果使用Session来填充吧哈哈(我的理念是:一天一进步,哪怕一丁点);对于一个web程序来说session存储通常有很多种方式,例如我前面文章有使用Redis来存储session的相关文章,那对于一个netcore项目来说默认session存储的方式是memorycache的方式,可以这样在项目中的 Startup.cs 文件中 ConfigureServices 方法增加如下代码片段:

       services.AddDistributedMemoryCache();

        services.AddSession(b =>

        {

        b.IdleTimeout = TimeSpan.FromMinutes(1);5 b.CookieName = "MySid";

        });

       并在 Configure 方法中添加 app.UseSession(); session的使用;当把上面的代码片段复制到你程序中时,会提示一个小灯泡,需要你点击选择引用下对应的包,对于vs自动装了netcore的开发环境,所以只需要点击灯泡引用就行了,如果你没有装开发sdk,那么需要下载nuget包: Microsoft.AspNetCore.Session ;第一段 services.AddDistributedMemoryCache() 主要作用是添加memorycache存储引用,第二段AddSession方法才是真正添加session相关的东西,这里我用到的两个个属性:

       1. IdleTimeout:设置session过期时间;

       2. CookieName:设置sessionId存储在客户端浏览器中的key名称;

       当完成上面步骤的操作后,可以在任意Controller(这里是HomeController)的Action中使用 HttpContext.Session.Set 方法添加session:

       public IActionResult About()

        {

        _logger.LogInformation("这里是About");

        var userInfo = "我的NetCore之Session";

        HttpContext.Session.Set(SessionKey, System.Text.Encoding.UTF8.GetBytes(userInfo));

        ViewData["Message"] = $"读取配置文件Option1节点值:{ this._options.Option1},添加session";

        return View();

        }

       再通过另外Contact的Action中使用 HttpContext.Session.TryGetValue(SessionKey, out var bt) 来获取我们刚设置的session:

       public IActionResult Contact()

        {

        var userInfo = string.Empty;

        if (HttpContext.Session.TryGetValue(SessionKey, out var bt))

        {

        userInfo = System.Text.Encoding.UTF8.GetString(bt);

        }

        ViewData["Message"] = string.IsNullOrWhiteSpace(userInfo) ? "Session获取为空" : userInfo;

        return View();

        }

       好了就这么简单,咋们运行看下效果:dontnet run 命令来运行测试站点,不出意外会在界面得到如下截图:

       通过浏览器控制台能够看到咋们的sessionId的名称是MySid,这个正如我们在 Startup.cs 设置的CookieName一样呢;

       ISession扩展方法

       上面用到的Set方法来保存sesseion,咋们来看看她的参数 void Set(string key, byte[] value); 键值对的方式,但是值是一个byte[]类型的参数,我们每次使用的时候都需要自己转一下数据类型感觉不是很方便,那么我们通过扩展方法的方式来扩展下 ISession ,如下扩展代码:

       public static class PublicExtensions

        {

        #region ISession扩展

        /// <summary>

        /// 设置session

        /// </summary>

        /// <typeparam name="T"></typeparam>

        /// <param name="session"></param>

        /// <param name="key"></param>

        /// <param name="val"></param>

        /// <returns></returns>

        public static bool Set<T>(this ISession session, string key, T val)

        {

        if (string.IsNullOrWhiteSpace(key) || val == null) { return false; }

        var strVal = JsonConvert.SerializeObject(val);

        var bb = Encoding.UTF8.GetBytes(strVal);

        session.Set(key, bb);

        return true;

        }

        /// <summary>

        /// 获取session

        /// </summary>

        /// <typeparam name="T"></typeparam>

        /// <param name="session"></param>

        /// <param name="key"></param>

        /// <returns></returns>

        public static T Get<T>(this ISession session, string key)

        {

        var t = default(T);

        if (string.IsNullOrWhiteSpace(key)) { return t; }

        if (session.TryGetValue(key, out byte[] val))

        {

        var strVal = Encoding.UTF8.GetString(val);

        t = JsonConvert.DeserializeObject<T>(strVal);

        }

        return t;

        }

        #endregion

        }

       直接传递一个对象T到扩展方法中,转类型后再存储的session中去,为了更好的测试我们直接在上面测试用例上修改代码如:

       public IActionResult About()

        {

        _logger.LogInformation("这里是About");

        //var userInfo = "我的NetCore之Session";

        //HttpContext.Session.Set(SessionKey, System.Text.Encoding.UTF8.GetBytes(userInfo));

        MoUser user = new MoUser();

        HttpContext.Session.Set<MoUser>(SessionKey, user);

        ViewData["Message"] = $"读取配置文件Option1节点值:{ this._options.Option1},添加session";

        return View();

        }

        public IActionResult Contact()

        {

        //var userInfo = string.Empty;

        //if (HttpContext.Session.TryGetValue(SessionKey, out var bt))

        //{

        // userInfo = System.Text.Encoding.UTF8.GetString(bt);

        //}

        //ViewData["Message"] = string.IsNullOrWhiteSpace(userInfo) ? "Session获取为空" : userInfo;

        var user = HttpContext.Session.Get<MoUser>(SessionKey);

        ViewData["Message"] = user == null ? "Session获取为空" : $"昵称:{ user.UserName}";

        return View();

        }

       看起来set或get的session操作都只需一句代码就完成了是不是方便了许多呢,最有命令:dotnet run 测试下效果,和上面的一样我就不截图了;

       1.1版本去掉了project.json后,如何生成跨平台包

       到这里就进入今天的正题了,对于最新版本netcore去掉project.json网上讨论的还算比较激烈,但是网搜了下还没有一篇正式的中文文章来讲述如果生成夸平台包,这里有幸或许吧成为第一篇吧呵呵;首先,要明了netcore小组去掉project.json重要文件后,其任务都放在了项目的.csproj文件中,没错就是咋们vs生成的项目工程文件,那上面测试用例为例我们看下.csproj文件的内容:

       <Project Sdk="Microsoft.NET.Sdk.Web">

        <PropertyGroup>

        <TargetFramework>netcoreapp1.1</TargetFramework>

        </PropertyGroup>

        <PropertyGroup>

        <PackageTargetFallback>$(PackageTargetFallback);portable-net+win8+wp8+wpa;</PackageTargetFallback>

        </PropertyGroup>

        <ItemGroup>

        <PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.0.0" />

        <PackageReference Include="Microsoft.AspNetCore" Version="1.1.1" />

        <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.2" />

        <PackageReference Include="Microsoft.AspNetCore.Session" Version="1.1.1" />

        <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="1.1.1" />

        <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="1.1.1" />

        <PackageReference Include="Microsoft.VisualStudio.Web.BrowserLink" Version="1.1.0" />

        </ItemGroup>

        <ItemGroup>

        <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="1.0.0" />

        </ItemGroup>

       </Project>

       这里能够直观的在ItemGroup节点看到我们添加进来的Session的引用和项目模板自带的Logging等的引用,已经父节点 Project Sdk="Microsoft.NET.Sdk.Web" ,我们要生成跨平台运行包,就需要操作这个项目文件的配置信息,这里只需要添加如下代码:

        <PropertyGroup>

        <RuntimeIdentifiers>win7-x;ubuntu..-x</RuntimeIdentifiers>

        </PropertyGroup>

       然后再通过发布命令就能够生成夸平台包了,是不是挺简单的,所以上面弄了一个Session小节做干货呢呵呵;咋们来测试下吧,首先在项目根目录这样以此执行命令:dontnet restore

       再执行你简短的发布命令(这里我直接采用默认参数的方式执行,发布包会生成再bin下面):dotnet publish

       这个时候我们能够在目录:bin\Debug\netcoreapp1.1下面看到publish文件夹,里面就是咋们程序执行文件了,为了测试下效果,这里我通过命令:dontnet WebApp.dll (由于我这里安装了sdk所以可以直接这样命令运行)来运行我的测试用例项目:

       到这里一个windows上运行的包就完成了,有朋友就开始疑惑那跨平台呢,还有您之前配置的 <RuntimeIdentifiers>win7-x;ubuntu..-x</RuntimeIdentifiers> 有什么效果呢,那这里就开始演示怎么生成ubunt..-x的运行包了(win7-x的也同样方式);我们同样需要经过:dontnet restore 之后发布命令的时候这样写:

       dotnet publish -f netcoreapp1.1 --runtime ubuntu..-x

       命令说明:

       -f:framework的缩写;

       netcoreapp1.1:是存放的文件夹;

       --runtime:运行命令必须要的;

       ubuntu..-x:存储的文件夹名称

       最后的结果是在目录:Debug\netcoreapp1.1 下面生成了一个ubuntu..-x文件夹,里面就是咋们的运行程序包了;如果你想生成其他系统的运行包也是同样的操作流程:

       1. 在项目.csproj中添加对应的Runtime命令(如:win7-x;osx.--x;ubuntu..-x);

       2. 在dotnet publish的时候把最后一个参数改成对应的Runtime命令就行了(如:ubuntu..-x)

       到此本文就结束了,希望能给您带来好的帮助,谢谢阅读;

copyright © 2016 powered by 皮皮网   sitemap