使用Newtonsoft.Json在C#中读取JSON:结构校验与model列表提取
一、你的JSON结构是否正确?
完全正确!我帮你核对了几个关键的JSON语法要求:
- 所有键名(比如
mercedes、model)和字符串值(比如GLS 350 d 4MATIC)都使用了双引号,这是JSON强制要求的(不能用单引号); - 数值类型的字段(
year、test_drive)没有加引号,符合JSON的类型规范; - 对象嵌套结构清晰,大括号、逗号的配对都没有问题;
- 最后两个顶级属性
test_drive(数值)和path(转义后的字符串)也完全合规,没有语法错误。
二、用Newtonsoft.Json在C#提取所有"model"属性为列表
别担心,这事儿其实不难,我给你一步步讲清楚:
第一步:先安装Newtonsoft.Json包
你需要先在你的C#项目里安装Newtonsoft.Json(也就是Json.NET),可以通过两种方式:
- 在Visual Studio的NuGet包管理器控制台输入:
Install-Package Newtonsoft.Json; - 或者在NuGet包管理器界面搜索“Newtonsoft.Json”,点击安装。
第二步:编写代码提取model列表
这里有两种实现方式,你可以选自己顺手的:
方式一:常规遍历(适合新手理解逻辑)
using Newtonsoft.Json.Linq; using System.Collections.Generic; using System; class Program { static void Main() { // 你的JSON字符串(注意转义双引号,也可以从文件读取) string jsonContent = @"{ ""mercedes"": { ""model"" : ""GLS 350 d 4MATIC"", ""code"" : ""MB-GLS"", ""year"": 2015 }, ""bmw"": { ""model"" : ""BMW 420d Cabrio"", ""code"" : ""BM-420D"", ""year"": 2017 }, ""audi"": { ""model"" : ""A5 Sportback 2.0 TDI quattro"", ""code"" : ""AU-A5"", ""year"": 2018 }, ""tesla"": { ""model"" : ""Model S"", ""code"" : ""TS-MOS"", ""year"": 2016 }, ""test_drive"": 0, ""path"": ""D:\\Mizz\\cars\\"" } "; // 把JSON字符串解析成JObject对象 JObject carData = JObject.Parse(jsonContent); // 创建列表存储所有model值 List<string> allModels = new List<string>(); // 遍历JSON里的所有顶级属性 foreach (var property in carData.Properties()) { // 只处理值是对象的属性(跳过test_drive、path这些非对象属性) if (property.Value.Type == JTokenType.Object) { // 提取当前对象里的model属性值 var modelValue = property.Value["model"]; // 确保model存在且是字符串类型 if (modelValue != null && modelValue.Type == JTokenType.String) { allModels.Add(modelValue.ToString()); } } } // 打印结果 foreach (var model in allModels) { Console.WriteLine(model); } } }
方式二:LINQ简化写法(代码更简洁)
如果熟悉LINQ的话,核心逻辑可以简化成一行:
using Newtonsoft.Json.Linq; using System.Collections.Generic; using System.Linq; using System; class Program { static void Main() { string jsonContent = @"{ ""mercedes"": { ""model"" : ""GLS 350 d 4MATIC"", ""code"" : ""MB-GLS"", ""year"": 2015 }, ""bmw"": { ""model"" : ""BMW 420d Cabrio"", ""code"" : ""BM-420D"", ""year"": 2017 }, ""audi"": { ""model"" : ""A5 Sportback 2.0 TDI quattro"", ""code"" : ""AU-A5"", ""year"": 2018 }, ""tesla"": { ""model"" : ""Model S"", ""code"" : ""TS-MOS"", ""year"": 2016 }, ""test_drive"": 0, ""path"": ""D:\\Mizz\\cars\\"" } "; JObject carData = JObject.Parse(jsonContent); List<string> allModels = carData.Properties() // 筛选出值为对象的顶级属性 .Where(p => p.Value.Type == JTokenType.Object) // 提取每个对象的model值并转成字符串 .Select(p => p.Value["model"]?.ToString()) // 过滤掉可能的null值(防止某个汽车对象没有model属性) .Where(m => !string.IsNullOrEmpty(m)) .ToList(); foreach (var model in allModels) { Console.WriteLine(model); } } }
额外说明
如果你的JSON是保存在文件里的,不需要硬编码字符串,直接用JObject.Load读取即可:
using (var reader = new StreamReader(@"D:\Mizz\cars\your-file.json")) { JObject carData = JObject.Load(reader); // 后面的提取逻辑和上面一致 }
内容的提问来源于stack exchange,提问作者user1372430
相关产品推荐
相关产品推荐

