.NET 对象转Json的方式

.NET 对象转Json的方式

在.NET中将对象转换为JSON有多种方法,以下是常用的几种方式:

1. 使用 System.Text.Json (推荐,.NET Core 3.0+)

基本序列化

csharp 复制代码
using System.Text.Json;

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Email { get; set; }
}

// 对象转JSON
var person = new Person { Name = "张三", Age = 25, Email = "zhangsan@example.com" };
string jsonString = JsonSerializer.Serialize(person);
Console.WriteLine(jsonString);
// 输出: {"Name":"张三","Age":25,"Email":"zhangsan@example.com"}

带选项的序列化

csharp 复制代码
var options = new JsonSerializerOptions
{
    WriteIndented = true, // 格式化输出
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase // 驼峰命名
};

string jsonString = JsonSerializer.Serialize(person, options);
Console.WriteLine(jsonString);
// 输出:
// {
//   "name": "张三",
//   "age": 25,
//   "email": "zhangsan@example.com"
// }

2. 使用 Newtonsoft.Json (Json.NET)

首先安装 NuGet 包:

复制代码
Install-Package Newtonsoft.Json
csharp 复制代码
using Newtonsoft.Json;

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Email { get; set; }
}

// 基本序列化
var person = new Person { Name = "李四", Age = 30, Email = "lisi@example.com" };
string jsonString = JsonConvert.SerializeObject(person);
Console.WriteLine(jsonString);

// 带格式的序列化
string formattedJson = JsonConvert.SerializeObject(person, Formatting.Indented);
Console.WriteLine(formattedJson);

Newtonsoft.Json 高级用法

csharp 复制代码
var settings = new JsonSerializerSettings
{
    Formatting = Formatting.Indented,
    NullValueHandling = NullValueHandling.Ignore,
    DateFormatString = "yyyy-MM-dd HH:mm:ss"
};

string jsonString = JsonConvert.SerializeObject(person, settings);

3. 处理复杂对象

包含集合的对象

csharp 复制代码
public class Department
{
    public string Name { get; set; }
    public List<Person> Employees { get; set; }
}

var department = new Department
{
    Name = "技术部",
    Employees = new List<Person>
    {
        new Person { Name = "王五", Age = 28, Email = "wangwu@example.com" },
        new Person { Name = "赵六", Age = 32, Email = "zhaoliu@example.com" }
    }
};

string jsonString = JsonSerializer.Serialize(department, new JsonSerializerOptions { WriteIndented = true });
Console.WriteLine(jsonString);

匿名对象序列化

csharp 复制代码
var anonymousObject = new
{
    Id = 1,
    Description = "测试对象",
    CreateTime = DateTime.Now
};

string jsonString = JsonSerializer.Serialize(anonymousObject);
Console.WriteLine(jsonString);

4. 自定义序列化选项

System.Text.Json 自定义

csharp 复制代码
var options = new JsonSerializerOptions
{
    WriteIndented = true,
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
    DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull,
    Converters = { new JsonStringEnumConverter() } // 枚举转换为字符串
};

string jsonString = JsonSerializer.Serialize(person, options);

使用特性控制序列化

csharp 复制代码
public class Product
{
    [JsonPropertyName("productName")] // System.Text.Json
    public string Name { get; set; }
    
    [JsonIgnore] // 忽略该属性
    public string InternalCode { get; set; }
    
    [JsonPropertyOrder(1)] // 属性顺序
    public decimal Price { get; set; }
}

5. 性能优化

使用源生成器 (System.Text.Json)

csharp 复制代码
[JsonSerializable(typeof(Person))]
[JsonSerializable(typeof(List<Person>))]
public partial class MyJsonContext : JsonSerializerContext
{
}

// 使用源生成器进行序列化
var person = new Person { Name = "测试", Age = 25 };
string jsonString = JsonSerializer.Serialize(person, MyJsonContext.Default.Person);

选择建议

  • 新项目 :推荐使用 System.Text.Json,性能更好,无需额外依赖
  • 现有项目:如果已经在使用 Newtonsoft.Json,可以继续使用
  • 复杂场景:Newtonsoft.Json 功能更丰富,支持更多复杂场景

两种方法都很常用,根据项目需求和个人偏好选择即可。

相关推荐
波力海苔夹心脆67518 小时前
C# 视觉检测实战:PLC 按钮触发 VisionPro 检测,OK 亮灯 / NG 灭灯(西门子 PLC,含界面显示与图片存档)
开发语言·经验分享·c#·自动化·视觉检测·.net
hez201019 小时前
一行代码在 .NET 项目里启用 Satori GC
c#·.net·.net core·gc·clr
QUDONG_biubiubiu1 天前
.NET Runtime 6.0/7.0/8.0/9.0下载修复教程,软件打不开这样解决
.net·net runtime下载·net运行库修复·net runtime安装
宝桥南山1 天前
.NET 11 - 尝试创建一下AGUIServer和AGUIClient(基于新版.NET SDK for AG-UI)
microsoft·ai·微软·c#·aigc·.net
波力海苔夹心脆6751 天前
C# LINQ 入门到上手:一篇讲透查询语法、常用操作符与延迟执行(含示例与速查表
经验分享·c#·.net·solr·linq
胖头鱼的鱼缸(尹海文)1 天前
胖头鱼的技术专栏-474 从能跑到能上线:PG SplitJSON 0.2.0 和 0.1.0 差在哪(20261008)
postgresql·json
?? Daisy2 天前
Claude Code 接入 GPT:settings.json 两种配置方法(2026-10)
gpt·json
小静AI工程实验室2 天前
Python 爬虫解析 JSON-LD:多块 script、@graph 与坏数据的 9 个边界
爬虫·python·json
小羊没烦恼!2 天前
Windows Azure Platform体验(1):Windows Azure
java·大数据·后端·python·flask·word·.net
goehou3 天前
LLM 结构化输出全解:从 Prompt 约束到 Schema 硬保证,三层实现怎么选
ai·llm·json·agent·教程·结构化输出