You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 16:40:59