展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > C# Json.NET解析JSON方法详解

C# Json.NET解析JSON方法详解

强类型反序列化适用于结构固定的JSON,通过定义C#类直接映射,提升类型安全和代码可读性;2.动态解析使用JObject/JArray,适合结构不确定或只需访问部分字段的场景,灵活性高;3.嵌套结构在强类型中通过类嵌套自动映射,在动态解析中通过链式索引访问;4.数组在强类型中映射为List<T>或T[],动态解析中转为JArray遍历处理;5.缺失字段可用可空类型、默认值或JsonProperty.Required控制,动态访问需null检查;6.类型不匹配会抛异常,可用try-catch捕获

强类型反序列化适用于结构固定的JSON,通过定义C#类直接映射,提升类型安全和代码可读性;2. 动态解析使用JObject/JArray,适合结构不确定或只需访问部分字段的场景,灵活性高;3. 嵌套结构在强类型中通过类嵌套自动映射,在动态解析中通过链式索引访问;4. 数组在强类型中映射为List或T[],动态解析中转为JArray遍历处理;5. 缺失字段可用可空类型、默认值或JsonProperty.Required控制,动态访问需null检查;6. 类型不匹配会抛异常,可用try-catch捕获,或自定义JsonConverter实现复杂转换;7. 性能优化包括避免中间对象、流式解析大文件、重用JsonSerializerSettings;8. 高级用法涵盖自定义JsonConverter、条件序列化ShouldSerialize、JsonProperty更多配置及循环引用处理,完整实现灵活高效的数据解析。

C#的Json.NET库如何解析JSON数据?

C#中使用Json.NET库解析JSON数据,核心在于将JSON字符串映射到C#对象。你可以选择强类型反序列化到预定义的类,或者使用JObject/JArray进行动态解析,这取决于你对JSON结构了解的程度和需求。

解决方案

谈到Json.NET解析JSON,我个人觉得它最迷人的地方在于其兼顾了便捷性和灵活性。很多时候,我们面对的JSON结构并非一成不变,或者我们只想抽取其中某个小片段,这时Json.NET的两种主要思路就派上用场了。

1. 强类型反序列化:当你对JSON结构了如指掌时

这是最推荐也最简洁的方式。如果你的JSON结构是固定的,或者你可以预先定义好对应的C#类,那么直接将JSON字符串反序列化到这些类实例上,能带来极佳的代码可读性和类型安全性。

比如,我们有这样一个JSON:

{
  "productId": 101,
  "productName": "Laptop Pro",
  "price": 1200.50,
  "tags": ["electronics", "computers", "portable"],
  "details": {
    "weightKg": 1.8,
    "color": "Space Gray"
  }
}

你可以这样定义C#类:

public class Product
{
    public int ProductId { get; set; }
    public string ProductName { get; set; }
    public decimal Price { get; set; }
    public List Tags { get; set; }
    public ProductDetails Details { get; set; }
}

public class ProductDetails
{
    public double WeightKg { get; set; }
    public string Color { get; set; }
}

然后,解析就变得异常简单:

using Newtonsoft.Json;
using System;
using System.Collections.Generic;

// 假设jsonString是上述JSON内容
string jsonString = @"{
  ""productId"": 101,
  ""productName"": ""Laptop Pro"",
  ""price"": 1200.50,
  ""tags"": [""electronics"", ""computers"", ""portable""],
  ""details"": {
    ""weightKg"": 1.8,
    ""color"": ""Space Gray""
  }
}";

try
{
    Product product = JsonConvert.DeserializeObject(jsonString);

    Console.WriteLine($"产品ID: {product.ProductId}");
    Console.WriteLine($"产品名称: {product.ProductName}");
    Console.WriteLine($"价格: {product.Price}");
    Console.WriteLine($"第一个标签: {product.Tags?[0]}"); // 注意null条件运算符
    Console.WriteLine($"颜色: {product.Details?.Color}");
}
catch (JsonSerializationException ex)
{
    Console.WriteLine($"反序列化错误: {ex.Message}");
}
catch (Exception ex)
{
    Console.WriteLine($"发生未知错误: {ex.Message}");
}

2. 动态解析:当你对JSON结构不确定或只想快速访问部分数据时

有时候,我们可能不清楚JSON的具体结构,或者只想获取其中一两个字段的值,为它专门定义一个类显得有些小题大做。这时,JObject和JArray就显得非常灵活了。它们允许你像操作字典或数组一样,通过键名或索引来访问JSON中的数据。

继续以上面的JSON为例:

using Newtonsoft.Json.Linq; // JObject, JArray都在这个命名空间下

string jsonString = @"{
  ""productId"": 101,
  ""productName"": ""Laptop Pro"",
  ""price"": 1200.50,
  ""tags"": [""electronics"", ""computers"", ""portable""],
  ""details"": {
    ""weightKg"": 1.8,
    ""color"": ""Space Gray""
  }
}";

try
{
    JObject jsonObject = JObject.Parse(jsonString);

    // 访问基本类型
    int productId = (int)jsonObject["productId"];
    string productName = (string)jsonObject["productName"];
    decimal price = jsonObject["price"].Value(); // 另一种获取值的方式

    Console.WriteLine($"产品ID (动态): {productId}");
    Console.WriteLine($"产品名称 (动态): {productName}");

    // 访问嵌套对象
    JObject details = (JObject)jsonObject["details"];
    string color = (string)details["color"];
    Console.WriteLine($"颜色 (动态): {color}");

    // 访问数组
    JArray tags = (JArray)jsonObject["tags"];
    foreach (JToken tag in tags)
    {
        Console.WriteLine($"标签: {tag.ToString()}");
    }

    // 安全地获取可能不存在的属性
    string nonExistentProperty = (string)jsonObject["nonExistent"]?.Value();
    Console.WriteLine($"不存在的属性: {nonExistentProperty ?? "未找到"}");
}
catch (JsonReaderException ex)
{
    Console.WriteLine($"JSON解析错误: {ex.Message}");
}
catch (Exception ex)
{
    Console.WriteLine($"发生未知错误: {ex.Message}");
}

这种动态解析方式在处理API响应不一致、或者需要快速原型验证时非常有用。它允许你先拿到数据,再决定如何处理,而不用急着定义一堆类。

如何处理JSON中的嵌套结构和数组?

处理JSON中的嵌套结构和数组,其实是Json.NET的强项,无论是强类型还是动态解析,都有非常直观的方法。我发现很多初学者在这里会有点困惑,觉得嵌套就复杂了,但实际上,只要理解了映射关系,它比你想象的要简单。

对于嵌套对象:

在强类型反序列化中,只需要在你的C#父类中,将子对象定义为另一个C#类的实例即可。Json.NET会自动递归地进行映射。比如,如果你的JSON有一个"user": { "name": "Alice", "age": 30 },那么你的RootObject类中就应该有一个public User User { get; set; }属性,而User类则包含Name和Age属性。

// JSON: { "orderId": "123", "customer": { "name": "Bob", "email": "bob@example.com" } }
public class Order
{
    public string OrderId { get; set; }
    public Customer Customer { get; set; } // 嵌套对象
}

public class Customer
{
    public string Name { get; set; }
    public string Email { get; set; }
}

// 解析
Order myOrder = JsonConvert.DeserializeObject(jsonString);
Console.WriteLine($"客户姓名: {myOrder.Customer.Name}");

在使用JObject动态解析时,嵌套对象就像是多层字典。你可以通过链式索引来访问:

JObject orderJson = JObject.Parse(jsonString);
string customerName = (string)orderJson["customer"]["name"]; // 链式访问
Console.WriteLine($"客户姓名 (动态): {customerName}");

对于数组:

数组的处理同样直接。强类型反序列化时,JSON数组通常映射到C#的List或T[]。如果数组包含复杂对象,那么T就是你定义的那个复杂对象类。

// JSON: { "productName": "Keyboard", "features": ["mechanical", "rgb", "wireless"] }
public class ProductWithFeatures
{
    public string ProductName { get; set; }
    public List Features { get; set; } // 字符串数组
}

// JSON: { "teamName": "Devs", "members": [{ "name": "Alice" }, { "name": "Bob" }] }
public class Team
{
    public string TeamName { get; set; }
    public List Members { get; set; } // 对象数组
}

public class Member
{
    public string Name { get; set; }
}

// 解析
ProductWithFeatures keyboard = JsonConvert.DeserializeObject(jsonString1);
Console.WriteLine($"第一个特性: {keyboard.Features[0]}");

Team devTeam = JsonConvert.DeserializeObject(jsonString2);
Console.WriteLine($"第一个成员: {devTeam.Members[0].Name}");

动态解析时,JSON数组会被解析成JArray。你可以像遍历C#数组一样遍历它,然后对每个JToken元素进行类型转换或进一步解析:

JObject productFeaturesJson = JObject.Parse(jsonString1);
JArray featuresArray = (JArray)productFeaturesJson["features"];
foreach (JToken feature in featuresArray)
{
    Console.WriteLine($"特性: {feature.ToString()}");
}

JObject teamJson = JObject.Parse(jsonString2);
JArray membersArray = (JArray)teamJson["members"];
foreach (JObject member in membersArray) // 注意这里直接转为JObject
{
    Console.WriteLine($"成员姓名: {(string)member["name"]}");
}

关键在于,Json.NET的设计理念就是将JSON的层级结构自然地映射到C#的对象图,无论是显式定义类还是通过JObject/JArray的嵌套访问,都保持了高度的一致性。

解析时遇到数据类型不匹配或缺失字段怎么办?

在实际开发中,JSON数据源往往不像示例那样完美,可能会出现字段缺失、数据类型不匹配,甚至额外字段的情况。处理这些“不完美”是健壮代码的体现,Json.NET提供了不少策略来应对。

1. 缺失字段:

  • 默认值和可空类型: 如果一个字段可能缺失,最简单的方法是将其C#属性定义为可空类型(如int?,decimal?)或者赋一个默认值。

    public class Product
    {
        public int ProductId { get; set; }
        public string ProductName { get; set; }
        public decimal? Price { get; set; } // Price可能缺失,所以用decimal?
        public string Description { get; set; } = "无描述"; // 缺失时使用默认值
    }

    当JSON中没有Price字段时,Price属性会被设为null。没有Description时,会保持“无描述”。

  • JsonProperty属性的Required选项: 如果某个字段是强制性的,缺失就应该报错,你可以使用[JsonProperty(Required = Required.Always)]。

    public class User
    {
        [JsonProperty(Required = Required.Always)] // 强制要求此字段必须存在
        public string Username { get; set; }
        public int Age { get; set; }
    }
    // 如果JSON中没有Username,会抛出JsonSerializationException

    Required.Default是默认值,表示如果JSON中没有该字段,则使用C#属性的默认值(null或0等)。Required.AllowNull表示字段可以缺失,如果存在但为null,则也允许。

  • 动态解析时的空值检查: 使用JObject时,在访问属性前进行null检查,或者使用C# 8的空条件运算符?.。

    JObject data = JObject.Parse("{ \"name\": \"Alice\" }");
    string email = (string)data["email"]?.Value(); // 如果email不存在,email会是null
    Console.WriteLine($"Email: {email ?? "N/A"}");

2. 数据类型不匹配:

这是最常见的错误源之一。比如JSON里一个数字字段,但C#里定义成了字符串。

  • JsonConvert.DeserializeObject抛出异常: 默认情况下,如果类型不匹配,Json.NET会抛出JsonSerializationException。这是好事,因为它提醒你数据结构与模型不符。

    // JSON: { "age": "thirty" } 但C#类中 age 是 int
    public class Person { public int Age { get; set; } }
    // JsonConvert.DeserializeObject(json) 会抛出异常

    处理方式通常是在外层用try-catch捕获这个异常,然后根据业务需求进行错误记录、重试或返回错误信息。

  • 自定义JsonConverter: 对于复杂的类型转换,例如JSON中的日期字符串格式不固定,或者需要将某个特定字符串映射到枚举类型,你可以实现一个自定义的JsonConverter。这提供了非常强大的控制力,让你能精确定义如何从JSON读取数据以及如何写入JSON。

    // 假设JSON中的日期是 "2023/10/27" 而不是标准ISO 8601
    public class CustomDateTimeConverter : JsonConverter
    {
        public override DateTime ReadJson(JsonReader reader, Type objectType, DateTime existingValue, bool hasExistingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.String)
            {
                return DateTime.ParseExact((string)reader.Value, "yyyy/MM/dd", null);
            }
            return default; // 或者抛出异常
        }
        // ... WriteJson 方法
    }
    
    public class Event
    {
        [JsonConverter(typeof(CustomDateTimeConverter))]
        public DateTime EventDate { get; set; }
    }

    然后JsonConvert.DeserializeObject(json)就会使用你的自定义转换器。

  • JToken.ToObject(): 在动态解析时,如果你不确定某个JToken的实际类型,但想尝试将其转换为特定C#类型,可以使用JToken.ToObject()。它会尝试进行转换,如果失败会抛出异常。

    JObject data = JObject.Parse("{ \"count\": \"123\" }");
    try
    {
        int count = data["count"].ToObject(); // 尝试将字符串"123"转为int
        Console.WriteLine($"Count: {count}");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"转换失败: {ex.Message}");
    }

总的来说,处理这些异常情况,核心思想是:预判可能的问题,利用Json.NET提供的特性(如可空类型、Required属性、自定义转换器),并在最外层进行try-catch,确保程序的健壮性。

性能优化与高级用法有哪些考量?

Json.NET作为一个广泛使用的库,在性能和高级功能方面都有不少值得探讨的地方。日常使用可能很少触及,但当处理大量数据、追求极致性能,或者有特殊序列化需求时,这些考量就显得很重要了。

1. 性能优化:

  • 避免不必要的中间对象: 如果你只需要JSON中的一小部分数据,并且这些数据是扁平的,直接使用JObject或JArray的索引访问通常比先反序列化成一个庞大的强类型对象再取值更高效,因为省去了创建大量C#对象的开销。

  • 流式解析(JsonTextReader): 对于非常大的JSON文件(比如几百MB甚至GB级别),一次性将整个JSON字符串加载到内存并解析成JObject或强类型对象可能会导致内存溢出。这时,使用JsonTextReader进行流式读取是最佳实践。它允许你逐个读取JSON令牌(如开始对象、属性名、值、结束对象等),从而在不将整个JSON加载到内存的情况下处理数据。这就像读文件一样,一行一行地读,而不是一次性读完。

    using (JsonTextReader reader = new JsonTextReader(new StringReader(largeJsonString)))
    {
        while (reader.Read())
        {
            if (reader.TokenType == JsonToken.PropertyName && reader.Value.ToString() == "targetProperty")
            {
                reader.Read(); // 读取属性值
                Console.WriteLine($"找到目标属性值: {reader.Value}");
                break;
            }
        }
    }

    当然,流式解析的缺点是需要手动管理状态,代码会复杂一些。

  • 重用JsonSerializerSettings: 如果你在应用程序中多次进行序列化/反序列化,并且使用了自定义设置(如日期格式、命名策略等),最好将JsonSerializerSettings实例创建一次并重用,而不是每次都新建。这可以减少GC压力和初始化开销。

  • 选择合适的序列化/反序列化方法: JsonConvert.SerializeObject和JsonConvert.DeserializeObject是静态方法,内部会创建JsonSerializer实例。如果需要频繁操作且有特定设置,直接创建和重用JsonSerializer实例会更高效。

    JsonSerializer serializer = new JsonSerializer();
    serializer.Converters.Add(new CustomDateTimeConverter());
    // ... 其他设置
    
    using (StringReader sr = new StringReader(jsonString))
    using (JsonTextReader reader = new JsonTextReader(sr))
    {
        MyObject obj = serializer.Deserialize(reader);
    }

2. 高级用法:

  • 自定义序列化/反序列化逻辑(JsonConverter): 前面提到了处理类型不匹配,但JsonConverter的用途远不止于此。你可以用它来处理多态(根据JSON中的某个字段决定反序列化成哪个子类)、特殊数据结构(如将一个对象序列化成数组形式)、或者对特定属性进行加密/解密。这需要继承JsonConverter并实现ReadJson和WriteJson方法。

  • 条件序列化(ShouldSerialize): 有时候你可能不希望所有属性都被序列化到JSON中,例如某些属性只有在满足特定条件时才需要。Json.NET允许你在类中定义一个名为ShouldSerialize[PropertyName]的方法,返回bool,来控制对应属性是否被序列化。

    public class UserProfile
    {
        public string Username { get; set; }
        public string Email { get; set; }
        public bool IsAdmin { get; set; }
    
        // 只有当IsAdmin为true时才序列化Email
        public bool ShouldSerializeEmail()
        {
            return IsAdmin;
        }
    }
  • JsonProperty属性的更多用法: 除了Required,JsonProperty还有很多其他有用的特性,比如PropertyName用于C#属性名和JSON字段名不一致的情况,Order用于控制JSON输出中属性的顺序,DefaultValue用于当属性值为默认值时是否序列化等。

  • 处理循环引用(ReferenceLoopHandling): 当你的C#对象图存在循环引用(A引用B,B又引用A)时,默认序列化会进入无限循环并抛出异常。你可以通过ReferenceLoopHandling设置来控制行为,例如Ignore(忽略循环引用)、Serialize(序列化所有引用,可能导致无限循环)、Error(默认,抛出异常)。通常设置为ReferenceLoopHandling.Ignore或ReferenceLoopHandling.Serialize配合PreserveReferencesHandling来解决。

  • 错误处理回调(Error事件): 在序列化或反序列化过程中,你可以通过JsonSerializerSettings.Error事件注册回调,来捕获和处理发生在特定属性上的错误,而不是直接抛出整个操作的异常。这在处理部分有效但部分损坏的JSON时非常有用。

这些高级用法,就像是Json

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发
相关文章 更多
精品专题 更多
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

IOS软件

正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

AI

正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

Mac软件 更多
WPS Office macOS版
WPS Office macOS版

WPS Office是一款面向macOS用户的综合办公套件,将文字处理、电子表格、演示文稿、PDF工具、模板与云协作整合在同一应用中。它兼容常见Microsoft Office格式,支持Intel及Apple芯片Mac,基础功能可免费使用,

Shapr3D macOS版
Shapr3D macOS版

Shapr3D是一款面向工业设计、机械工程、建筑概念和三维打印工作流的CAD软件。Mac版采用Parasolid建模内核,支持草图约束、实体建模、工程图、可视化渲染及常见CAD格式交换,并可通过账户在多台设备之间同步项目。

REAPER macOS版
REAPER macOS版

REAPER是Cockos开发的数字音频工作站,提供多轨音频与MIDI录制、剪辑、处理、混音和母带制作工具。Mac版兼容Intel与Apple芯片,支持AU、VST、VST3、CLAP等插件格式,并提供高度可定制的工作流程。

Ableton Live macOS版
Ableton Live macOS版

Ableton Live 是面向音乐制作人与现场表演者的数字音频工作站,提供编曲视图、独具特色的现场视图、音频录制、MIDI创作、实时变速、乐器及效果器。Mac版原生支持Apple芯片,并可连接音频接口、MIDI控制器和第三方插件。

Adobe After Effects macOS版
Adobe After Effects macOS版

Adobe After Effects 是面向动态图形、影视特效与视频合成的专业创作软件。它提供关键帧动画、遮罩抠像、运动跟踪、三维空间、文字动画和表达式等工具,并可与 Premiere Pro、Photoshop、Illustrator

Adobe Audition macOS版
Adobe Audition macOS版

Adobe Audition 是面向播客、影视后期、音乐制作及内容创作者的专业音频工作站,提供波形精修、多轨录制与混音、频谱编辑、降噪修复、响度匹配和效果处理工具,并可与 Adobe Premiere 协同完成视频声音制作。

Adobe Bridge macOS版
Adobe Bridge macOS版

Adobe Bridge 是面向摄影师、设计师及内容团队的免费数字资产管理工具,可集中预览照片、视频和 Adobe 项目文件,并利用评级、标签、关键词、元数据、筛选与收藏集完成分类检索。它还支持批量重命名、格式导出、相机导入及 Camera

Adobe Illustrator macOS版
Adobe Illustrator macOS版

Adobe Illustrator 是 Adobe 推出的专业矢量图形设计软件,适合在 Mac 上制作标志、图标、插画、包装、信息图及印刷版面。它以路径和锚点构建可无损缩放的图形,并提供钢笔、形状、文字、图像描摹、渐变、画板及生成式功能。

Adobe InDesign macOS版
Adobe InDesign macOS版

Adobe InDesign 是面向印刷品与数字出版物的专业版面设计软件,可在 Mac 上制作书籍、杂志、宣传册、海报、报告及交互式文档。它提供精细的文字样式、网格、母版、长文档管理和印前输出能力。

Adobe Lightroom Classic macOS版
Adobe Lightroom Classic macOS版

Adobe Lightroom Classic 是面向桌面摄影工作流的照片管理与后期处理软件,可将原始照片保存在本地硬盘,通过目录、关键词、评分和收藏夹高效整理图库,并提供 RAW 冲印、蒙版、镜头校正、批量同步及多格式导出等功能。

Adobe Media Encoder macOS版
Adobe Media Encoder macOS版

Adobe Media Encoder 是 Adobe 推出的专业音视频编码与转码工具,可通过队列、预设和监视文件夹批量完成格式转换、代理文件创建及多平台成片输出,并与 Premiere Pro、After Effects 等软件紧密协作。

Adobe Photoshop macOS版
Adobe Photoshop macOS版

Adobe Photoshop 是面向摄影师、设计师和内容创作者的专业图像处理软件,提供图层、蒙版、选区、修复、调色、文字排版、智能对象及生成式编辑等能力。Mac 版支持 Intel 与 Apple Silicon 处理器。

WINDOWS 更多
Adobe Photoshop Windows版
Adobe Photoshop Windows版

Adobe Photoshop 是面向摄影师、设计师和内容创作者的专业图像处理工具,可在 Windows 上完成照片修饰、选区抠图、图层合成、文字排版、绘画及生成式编辑。软件采用订阅授权,由 Creative Cloud 管理安装、更新与许

Adobe InDesign Windows版
Adobe InDesign Windows版

Adobe InDesign 是面向印刷与数字出版的专业页面排版工具,可制作书籍、杂志、宣传册、海报、交互式 PDF 和电子书。它提供精细的文字样式、多页面管理、印前检查及多格式输出能力,并能与 Photoshop、Illustrator

Adobe Illustrator Windows版
Adobe Illustrator Windows版

Adobe Illustrator 是用于绘制矢量图形、插画、图标、徽标和版式的专业设计工具。它以路径和锚点为核心,作品放大后仍能保持清晰,并提供画板、文字、渐变、图像描摹及精确变换等功能,适合品牌视觉、印刷物料、数字界面和商业插画创作。

Adobe Bridge Windows版
Adobe Bridge Windows版

Adobe Bridge 是 Adobe 推出的创意资产管理工具,可集中预览、分类和查找照片、视频、PDF及多种设计文件,并支持元数据、关键词、评级、批量重命名和格式导出。它可与 Photoshop、Illustrator 等应用衔接,

Affinity Photo Windows版
Affinity Photo Windows版

Affinity Photo 是一款面向摄影师、修图师和视觉设计人员的桌面图像编辑工具,提供 RAW 显影、多图层合成、蒙版、实时滤镜、批处理和色彩管理等功能。原独立产品已停止销售,其照片编辑能力已延续至免费的新 Affinity 应用;

Adobe Lightroom Classic Windows版
Adobe Lightroom Classic Windows版

Adobe Lightroom Classic 是面向 Windows 桌面摄影工作流的照片管理与无损编辑工具,可通过目录集中整理大型图库,并完成 RAW 显影、局部蒙版、批量调整、打印和多格式导出。它强调本地文件管理与精细控制,

Figma Windows版
Figma Windows版

Figma 是面向产品设计与开发团队的云端协作平台,可在 Windows 桌面客户端中完成界面绘制、组件管理、交互原型、评论评审和开发交付。文件保存在云端,多名成员能够同步编辑并共享设计系统;官方同时提供免费 Starter 方案及按席位计

Affinity Designer Windows版
Affinity Designer Windows版

Affinity Designer 是面向矢量图形、数字插画和界面设计的专业创作工具,可在矢量、像素与导出工作区之间快速切换。它提供曲线编辑、形状构建、画板、排版、图层和专业色彩管理,并支持常见设计文件的导入及多种印刷、网页格式输出。

Capture One Pro Windows版
Capture One Pro Windows版

Capture One Pro 是面向摄影师和影像团队的专业桌面照片处理工具,提供相机定制色彩配置、RAW转换、图层与蒙版、联机拍摄、目录及会话管理等功能。它适合棚拍、人像、商业产品、婚礼和风光摄影,

Adobe Acrobat Pro Windows版
Adobe Acrobat Pro Windows版

Adobe Acrobat Pro 是面向专业 PDF 工作的综合解决方案,可在 Windows 中创建、编辑、转换、比较、整理和保护文档,并支持表单、电子签名、扫描件文字识别及敏感信息永久遮盖。订阅还包含网页、移动服务和云端协作能力,

Adobe After Effects Windows版
Adobe After Effects Windows版

Adobe After Effects 是面向动态图形、动画与影视视觉特效制作的专业工具,可完成关键帧动画、图层合成、遮罩跟踪、抠像、文字动画和二维三维元素整合。Windows 版通过 Adobe Creative Cloud 安装及更新,

DaVinci Resolve Windows版
DaVinci Resolve Windows版

DaVinci Resolve是Blackmagic Design推出的一体化影视后期工具,将素材管理、非线性剪辑、专业调色、Fusion视觉特效、Fairlight音频处理和成片交付整合在统一工程中。免费版已覆盖多数个人创作需求,