如何在C#中正确反序列化自定义格式的JSON文件?
我来帮你搞定这个JSON反序列化的问题——用System.Runtime.Serialization.Json处理这类场景其实没那么复杂,核心是要把数据模型和反序列化的类型匹配好。
正确使用System.Runtime.Serialization.Json的步骤
首先,你需要先定义匹配JSON结构的数据模型,这个命名空间的序列化器依赖DataContract和DataMember特性来做字段映射,这一步不能少。
假设你的JSON是单个或多个顶点对象组成的结构(比如单个对象{"path":"include\\fooo\\Gell.h"},或者数组[{"path":"include\\fooo\\Gell.h"}]),我们先定义对应的实体类:
1. 定义数据实体类
using System.Runtime.Serialization; [DataContract] public class Vertex { // 用Name参数指定JSON里的键名,确保和JSON中的大小写完全匹配 [DataMember(Name = "path")] public string Path { get; set; } }
2. 处理单个/多个元素的通用反序列化逻辑
因为你的JSON可能包含1个或多个连续元素,最稳妥的方式是按数组类型来反序列化——这样不管是单个对象还是多个对象组成的数组,都能正确解析:
using System.IO; using System.Collections.Generic; using System.Runtime.Serialization.Json; // 读取JSON文件流 using (var fileStream = new FileStream("你的JSON文件路径.json", FileMode.Open, FileAccess.Read)) { // 初始化序列化器,指定目标类型为List<Vertex>(也可以用Vertex[]数组) var serializer = new DataContractJsonSerializer(typeof(List<Vertex>)); // 执行反序列化 var vertices = (List<Vertex>)serializer.ReadObject(fileStream); // 验证结果:输出第一个元素的Path值 if (vertices.Count > 0) { Console.WriteLine(vertices[0].Path); // 会输出 include\fooo\Gell.h } }
之前代码失效的常见原因
如果你的原有代码没达到预期,大概率是这几个问题:
- 没给类和属性添加
[DataContract]、[DataMember]特性,序列化器无法识别字段映射关系 - 反序列化时指定的类型不对(比如用了
typeof(Vertex)但实际JSON是数组,或者反过来) DataMember的Name参数和JSON中的键名不匹配(这个序列化器是大小写敏感的)
可选替代方案
如果你觉得System.Runtime.Serialization.Json的约束有点多,也可以用更灵活的Newtonsoft.Json(Json.NET),代码会简洁不少:
using Newtonsoft.Json; using System.IO; // 读取JSON文本内容 var jsonContent = File.ReadAllText("你的JSON文件路径.json"); // 直接反序列化为List<Vertex> var vertices = JsonConvert.DeserializeObject<List<Vertex>>(jsonContent);
(这里的Vertex类可以不用加特性,默认按属性名匹配,也可以用JsonProperty特性手动指定键名)
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

