C#控制台应用JSON反序列化及控制台输入路径读取问题求助
问题解决:C#控制台应用JSON反序列化与文件路径读取
1. 解决JSON反序列化返回null的问题
核心原因
你的Input类中Command属性是大写开头,但JSON里的字段是"command"(小写),System.Text.Json默认区分大小写,导致字段匹配失败,最终反序列化返回null。另外用object作为Payload类型虽可行,但默认会被反序列化为JsonElement,后续处理需要额外转换。
修复方案
方案一:启用大小写不敏感匹配
反序列化时配置JsonSerializerOptions,允许属性名大小写不匹配:
var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; List<Input> commands = JsonSerializer.Deserialize<List<Input>>(jsonContent, options);
方案二:用特性指定JSON字段名
给Input类的属性加上JsonPropertyName特性,明确对应JSON中的字段名:
using System.Text.Json.Serialization; public class Input { [JsonPropertyName("command")] public string Command { get; set; } [JsonPropertyName("payload")] public object Payload { get; set; } }
进阶:针对不同Command处理Payload
如果需要强类型处理Payload,可以根据Command值反序列化为对应类型,示例如下:
// 定义不同命令的Payload类 public class AddItemPayload { public int id { get; set; } public int catId { get; set; } public int sId { get; set; } public double price { get; set; } public int quantity { get; set; } } // 反序列化后处理 foreach (var cmd in commands) { if (cmd.Command == "addItem") { var payload = JsonSerializer.Deserialize<AddItemPayload>(JsonSerializer.Serialize(cmd.Payload)); // 处理addItem逻辑 } // 其他命令同理 }
2. 从控制台读取输入文件路径
替换硬编码路径,改为读取用户控制台输入,并增加基础校验:
Console.WriteLine("请输入输入文件的路径:"); string inputFilePath = Console.ReadLine(); // 处理空输入 if (string.IsNullOrWhiteSpace(inputFilePath)) { Console.WriteLine("输入路径不能为空"); return; } // 转换为绝对路径(可选,处理相对路径) inputFilePath = Path.GetFullPath(inputFilePath); if (!File.Exists(inputFilePath)) { Console.WriteLine($"文件不存在:{inputFilePath}"); return; } // 后续读取文件逻辑不变 string jsonContent = await File.ReadAllTextAsync(inputFilePath); // ... 反序列化及执行命令
内容的提问来源于stack exchange,提问作者mth12
相关产品推荐
相关产品推荐

