当前位置: 首页 > news >正文

使用 Newtonsoft.Json(Json.NET)库将对象导出为格式化的 JSON 文件

使用 Newtonsoft.Json(Json.NET)库将对象导出为格式化的 JSON 文件是 C# 中常见的操作,以下是详细的实现步骤、常用属性和方法说明:

一、基础实现:对象 → 格式化 JSON 文件

步骤 1:安装 Newtonsoft.Json

通过 NuGet 安装:

  • 右键 项目 → 管理 NuGet 包 → 搜索 Newtonsoft.Json → 安装。
步骤 2:核心代码(对象转格式化 JSON 并保存为文件)
using Newtonsoft.Json;
using System;
using System.IO;// 1. 定义示例对象
public class Product
{public int Id { get; set; }public string Name { get; set; }public decimal Price { get; set; }public bool IsInStock { get; set; }
}class Program
{static void Main(){// 2. 创建对象实例var product = new Product{Id = 1001,Name = "笔记本电脑",Price = 5999.99m,IsInStock = true};// 3. 序列化对象为格式化的 JSON 字符串string json = JsonConvert.SerializeObject(value: product,formatting: Formatting.Indented, // 关键:启用格式化(缩进+换行)settings: new JsonSerializerSettings{// 可选配置:处理日期、空值、循环引用等DateFormatString = "yyyy-MM-dd HH:mm:ss", // 日期格式NullValueHandling = NullValueHandling.Ignore, // 忽略 null 值属性ReferenceLoopHandling = ReferenceLoopHandling.Ignore // 忽略循环引用});// 4. 保存到文件string filePath = @"C:\data\product.json";// 确保目录存在(不存在则创建)Directory.CreateDirectory(Path.GetDirectoryName(filePath));// 写入文件File.WriteAllText(filePath, json);Console.WriteLine($"JSON 文件已保存至:{filePath}");}
}
生成的 JSON 文件内容(格式化后)
{"Id": 1001,"Name": "笔记本电脑","Price": 5999.99,"IsInStock": true
}

二、常用核心方法

1. JsonConvert.SerializeObject(对象 → JSON 字符串)

最核心的序列化方法,签名:

public static string SerializeObject(object value,               // 要序列化的对象Formatting formatting,      // 格式化选项(None:紧凑格式;Indented:缩进格式)JsonSerializerSettings settings // 序列化配置(可选)
)

示例

// 紧凑格式(无缩进)
string compactJson = JsonConvert.SerializeObject(product, Formatting.None);// 缩进格式(格式化)
string indentedJson = JsonConvert.SerializeObject(product, Formatting.Indented);
2. JsonSerializerSettings(序列化配置类)

用于自定义序列化行为,常用属性:

属性名说明
DateFormatString日期时间格式化字符串(如 "yyyy-MM-dd"),默认是 ISO 格式。
NullValueHandling控制 null 值的处理:- NullValueHandling.Include(默认):保留 null 值- NullValueHandling.Ignore:忽略 null 值属性
ReferenceLoopHandling处理对象循环引用(如 A 包含 B,B 包含 A):- ReferenceLoopHandling.Error(默认):抛异常- ReferenceLoopHandling.Ignore:忽略循环引用- ReferenceLoopHandling.Serialize:序列化循环引用(生成 $ref 标记)
ContractResolver自定义序列化规则(如属性排序、动态排除属性等),需配合 DefaultContractResolver 子类使用。
TypeNameHandling控制是否序列化类型信息(如基类对象序列化时保留具体子类类型),默认不序列化。
Converters自定义转换器集合(如处理枚举、特殊类型的序列化)。
3. 特性(Attribute)控制单个属性

通过在类的属性上添加特性,精细控制序列化行为:

特性名说明
[JsonProperty]自定义 JSON 中的属性名、排序、是否序列化等:- PropertyName:指定 JSON 中的键名(如 [JsonProperty("product_id")])- Order:控制属性排序(值越小越靠前)- NullValueHandling:单独控制该属性的 null 值处理
[JsonIgnore]序列化时排除当前属性(如敏感信息:密码、Token 等)。
[JsonRequired]标记属性为必需,若为 null 则序列化时抛异常。
[JsonConverter]为当前属性指定自定义转换器(如枚举转字符串、日期转特定格式)。

示例

public class User
{[JsonProperty("user_id", Order = 1)] // JSON 键名为 "user_id",排序优先级 1public int Id { get; set; }[JsonProperty(Order = 2)]public string Name { get; set; }[JsonIgnore] // 排除密码public string Password { get; set; }[JsonProperty(NullValueHandling = NullValueHandling.Ignore)] // 单独忽略该属性的 null 值public string Email { get; set; }
}

三、高级场景:动态控制序列化

1. 动态排除属性

通过自定义 ContractResolver 排除特定属性(如根据条件排除):

public class ExcludePropertiesResolver : DefaultContractResolver
{private readonly HashSet<string> _excludedProps;public ExcludePropertiesResolver(IEnumerable<string> excludedProps){_excludedProps = new HashSet<string>(excludedProps);}protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization){JsonProperty property = base.CreateProperty(member, memberSerialization);// 若属性在排除列表中,则不序列化if (_excludedProps.Contains(property.PropertyName)){property.ShouldSerialize = _ => false;}return property;}
}// 使用:排除 "Price" 属性
var settings = new JsonSerializerSettings
{ContractResolver = new ExcludePropertiesResolver(new[] { "Price" }),Formatting = Formatting.Indented
};
string json = JsonConvert.SerializeObject(product, settings);
2. 自定义类型转换

通过 JsonConverter 处理特殊类型(如枚举转中文描述):

// 枚举定义
public enum Status { Active, Inactive }// 自定义转换器
public class StatusConverter : JsonConverter<Status>
{public override void WriteJson(JsonWriter writer, Status value, JsonSerializer serializer){// 序列化时将枚举转为中文string desc = value == Status.Active ? "激活" : "未激活";writer.WriteValue(desc);}public override Status ReadJson(JsonReader reader, Type objectType, Status existingValue, bool hasExistingValue, JsonSerializer serializer){// 反序列化逻辑(按需实现)string value = reader.Value.ToString();return value == "激活" ? Status.Active : Status.Inactive;}
}// 使用:在属性上标记转换器
public class Order
{public int Id { get; set; }[JsonConverter(typeof(StatusConverter))]public Status Status { get; set; }
}

四、总结

  1. 核心流程:对象 → JsonConvert.SerializeObject(带 Formatting.Indented)→ 生成格式化 JSON → File.WriteAllText 保存为文件。
  2. 常用配置:通过 JsonSerializerSettings 控制全局行为(日期、null 值、循环引用),通过特性([JsonProperty][JsonIgnore])控制单个属性。
  3. 高级用法:自定义 ContractResolver 动态排除属性,自定义 JsonConverter 处理特殊类型转换。

掌握这些方法可以灵活处理绝大多数对象到 JSON 文件的导出需求,满足格式化、自定义字段、特殊类型转换等场景。

http://www.dtcms.com/a/592886.html

相关文章:

  • 林州市网站建设给个网站好人有好报
  • 使用前端框架vue做一个小游戏
  • 【操作系统原理】进程优先级与命令行参数、环境变量详解
  • 【深度学习新浪潮】扩散模型中,VAE潜空间正则化如何为生成带来帮助?
  • 从零学习Node.js框架Koa 【四】Koa 与数据库(MySQL)连接,实现CRUD操作
  • Zotero在代理模式下无法同步问题
  • LeetCode(python)——438.找到字符串中所有字母异位词
  • 解决添加asp.net网站报错请添加 MIME 映射
  • 浙江省工程建设管理协会网站常州小程序开发公司
  • ASP vs ASP.NET vs ASP.NET Core:三代微软 Web 技术核心区别解析
  • 【项目设计】基于正倒排索引的Boost搜索引擎
  • 建网站需要几程序员关键词网站优化平台
  • 深圳网站建设方案书做sns网站需要什么
  • C语言常见推理题
  • leetcode 3542. 将所有元素变为 0 的最少操作次数 中等
  • 一文掌握,sward安装与配置
  • Supabase 开源 BaaS 平台的技术内核与实践指南
  • YOLOv5+DeepSORT目标检测
  • 通过Prometheus对GPU集群进行监控以及搭建(小型集群)
  • 【datawhale】Agentic AI学习笔记
  • 江苏国龙翔建设公司网站找工作网站建设
  • 网站建设及在线界面设计
  • Aloha浏览器 7.10.1 |私人浏览器,极速上网,资源嗅探
  • 多Agent协同-详解
  • Spring Boot 数据库操作实战:MyBatis 让 CRUD 像 “查奶茶库存” 一样简单
  • 电脑五笔打字入门口诀:3天学会五笔打字拆字
  • 自动驾驶中的B样条轨迹及B样条<->贝塞尔转换实现避障
  • 南阳市做网站网站开发是什么专业百度
  • 做外包的网站有哪些问题最好玩的网站
  • 阿尔及尔至广州直飞航线成功首航