使用 Source Generator 将 JSON 转换成 C# 类

2个月前 (11-17 23:51)阅读2回复0
小强
小强
  • 管理员
  • 注册排名8
  • 经验值99190
  • 级别管理员
  • 主题19838
  • 回复0
楼主

点击上方蓝字

存眷我们

(本文阅读时间:6分钟)

有时候,我们需要将通过 WebAPI 领受 JSON 字符串转换成 C# 代码。Visual Studio 供给了一个功用菜单能够轻松实现:

施行完成后,它会将生成的代码放在翻开的代码窗口中。

但是,若是有多个 JSON 字符串需要转换,那个过程十分繁琐,并且容易出错。

本文将介绍 若何利用 Source Generator 将 JSON 字符串转换成 C# 类。

微软MVP尝试室研究员

张海

展开全文

微软最有价值专家,次要存眷 .NET 相关的手艺及处理计划,努力于将小我的输入改变为输出,公家号:My IO

实现原理

▌解析 JSON 字符串

起首,我们需要解析 JSON 字符串,阐发它的构造,再对应到 C# 类。那里,我们利用 System.Text.Json 库。

通过 JsonDocument.Parse办法解析 JSON 字符串,它将返回一个 JsonDocument对象:

using var jsonDocument = JsonDocument.Parse(json);

下图很好的阐了然 JsonDocument的构造:

一个 JsonDocument 由多个 JsonElement 和 JsonProperty 构成

一个 JsonElement 包罗多个 JsonProperty

一个 JsonProperty 的值也是一个 JsonElement

通过递归遍历,我们能够解析出 JSON 字符串的构造。

▌婚配 C# 类型

接下来,我们需要将解析出的 JSON 字符串构造,婚配成 C# 类型。那里,我们利用如下代码来存储类和属性信息:

public class ParsedType

//名称

public string Name { get; private set; }

//类型

public TypeEnum Type { get; private set; }

//针对 Array 的类型

public ParsedType InternalType { get; private set; }

//属性列表

public IListPropertyInfo Properties { get; internal set; }

//能否是顶级类,用于区分嵌套子类

public bool IsRoot { get; internal set; }

public class PropertyInfo

public string Name { get; private set; }

public string JsonName { get; private set; }

public ParsedType Type { get; private set; }

▌生成 C# 类代码

婚配出了 C# 类型,生成 C# 类代码就十分容易了。那里,我们利用如下代码:

WriteFileStart(sw,name_space,class_name);

foreach (var typeintypes)

WriteClass(sw, type);

WriteFileEnd(sw);

types 是上一步解析出的 ParsedType 聚集。

▌Source Generator

如今,我们需要利用 Source Generator 将完好流程实现。起首,我们定义了一个 Attribute:

const string attributeText = @ "using System;

namespace MyIO

[AttributeUsage(AttributeTargets.Class)]

public sealed class ParseJsonAsClassAttribute : Attribute

public ParseJsonAsClassAttribute(string fileName)

FileName = fileName;

public string FileName { get; set; }

context.AddSource( "MyIO.ParseJsonAsClassAttribute.g", SourceText.From(attributeText, System.Text.Encoding.UTF8));

然后,我们遍历项目中所有声了然ParseJsonAsClassAttribute的类,拿到namesapce、classname和 JSON 字符串,生成 C# 类代码,然后写到项目中:

foreach (var memberSyntax inmemberSyntaxes)

if(memberSyntax is ClassDeclarationSyntax classDeclarationSyntax)

var name_space = GetNamespace(classDeclarationSyntax);

var class_name = classDeclarationSyntax.Identifier.ValueText;

string json = GetJson(classDeclarationSyntax);

if(json == null)

continue;

var sourceText = GenerateSource(name_space, class_name, json);

if(sourceText != null)

this.context.AddSource( "MyIO.ParseJsonAsClass."+ classDeclarationSyntax.Identifier.ValueText + ".g", sourceText);

this.context.CancellationToken.ThrowIfCancellationRequested;

利用

1、在项目中安拆 NuGet 包

dotnet add package MyIO.ParseJsonAsClass.SourceGenerator

2、在项目中添加一个 JSON 文件

"code": 200,

"msg": "ok",

"obj":{ "a": 1, "subObj":{ "a": 1}},

"data": [

"1", "2"

"array": [

{ "a": 1.0},

{ "a": null}

3、在项目中添加一个 C# 文件

usingMyIO;

namespaceConsoleApp1

[ ParseJsonAsClass( "sample.txt") ]

internalpartialclassClass1

sample.txt 是上一步中添加的 JSON 文件的名称。

4、编译项目

*未经受权请勿擅自转载此文章及图片。

欢送前去 GitHub 获取相关源代码信息。

微软最有价值专家(MVP)

微软最有价值专家是微软公司授予第三方手艺专业人士的一个全球奖项。29年来,世界各地的手艺社区指导者,因其在线上和线下的手艺社区平分享专业常识和经历而获得此奖项。

MVP是颠末严酷挑选的专家团队,他们代表着手艺最精湛且更具聪慧的人,是对社区投入极大的热情并乐于助人的专家。MVP努力于通过演讲、论坛问答、创建网站、撰写博客、分享视频、开源项目、组织会议等体例来搀扶帮助别人,并更大程度地搀扶帮助微软手艺社区用户利用 Microsoft 手艺。

更多详情请登录官方网站:

0
回帖

使用 Source Generator 将 JSON 转换成 C# 类 期待您的回复!

取消
载入表情清单……
载入颜色清单……
插入网络图片

取消确定

图片上传中
编辑器信息
提示信息