C# .Net Core中如何像JavaScript一样简便创建易读JSON对象
C# 构建JSON的简洁实现方案
你之前使用JsonObject写法冗余、@字符串体验差,本质是API选型和使用场景不匹配,以下是生产环境常用的简洁实现,写起来和JS的对象字面量体验差距极小:
方案1:匿名对象 + JSON序列化(最推荐,覆盖90%场景)
这是最接近JS开发体验的方案,不需要提前定义类型,支持直接引用外部变量,自动处理嵌套结构、数组、特殊字符转义,从根源上避免JSON格式错误。
首先引入所需命名空间:
using System.Text.Json; using System.Text.Json.Serialization;
全局配置一次序列化规则(比如自动转驼峰命名、忽略null值,和前端JSON规范对齐):
var jsonOptions = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull };
构建JSON的代码和JS写法几乎一致,不需要层层嵌套new JsonObject/new JsonArray:
var payload = new { documentId = documentID, testMode = true, signers = new[] { new { label = "John Smith", contactMethod = new[] { new { type = "link" } } } } }; // 一步生成标准JSON字符串 string jsonPayload = JsonSerializer.Serialize(payload, jsonOptions);
补充:你之前用的
JsonObject/JsonArray属于JSON DOM操作API,设计目标是动态解析、修改结构未知的JSON,用来从头构建固定结构的数据自然会显得繁琐。如果项目用Newtonsoft.Json(Json.NET),该写法完全通用,仅需把序列化方法替换为JsonConvert.SerializeObject(payload, jsonOptions)即可。
方案2:C# 11+ 原始字符串插值(适合固定结构、变量少的场景)
C# 11新增的原始字符串字面量解决了老版@逐字字符串的所有痛点:
- 自动对齐代码缩进,不会把代码里的回车、前置空格注入到字符串内容中
- 支持插值语法直接嵌入变量,不需要大量
+拼接 - 可以通过
$的数量自定义插值括号的数量,避免和JSON本身的大括号冲突
示例代码:
// $$ 表示插值使用两个大括号,和JSON自带的单大括号区分 string jsonPayload = $$""" { "documentId": "{{documentID}}", "testMode": true, "signers": [ { "label": "John Smith", "contactMethod": [ { "type": "link" } ] } ] } """;
注意:该方案不会自动转义变量中的双引号、换行等特殊字符,如果嵌入的变量内容不可控,可能生成格式错误的JSON,这类场景请优先选择方案1。
方案3:Record强类型定义(适合结构固定、多次复用的场景)
如果同一个JSON结构需要在多处使用,可以用C#的record类型一行定义数据结构,后续构建代码更简洁,还能获得编译时的强类型检查:
// 数据结构仅需定义一次 record ContactMethod(string Type); record Signer(string Label, ContactMethod[] ContactMethod); record JsonPayload(string DocumentId, bool TestMode, Signer[] Signers); // 构建时直接传值即可 var payload = new JsonPayload( documentID, true, new[] { new Signer("John Smith", new[] { new ContactMethod("link") }) } ); string jsonPayload = JsonSerializer.Serialize(payload, jsonOptions);
内容的提问来源于stack exchange,提问作者stonedonkey
相关产品推荐
相关产品推荐

