我有一个控制台应用程序,我想从输入文件读取命令并将相应的输出写入另一个文件。我的示例命令之一如下所示:
[{"command":"addItem","payload":{"id":1,"catId":1,"sId":1,"price":1.2,"quantity":1}}]
我正在尝试使用 System.Text.Json 反序列化此命令。这是相关的代码片段:
public class Input
{
public string Command { get; set; }
public object Payload { get; set; }
}
List<Input> command = JsonSerializer.Deserialize<List<Input>>(commandLine);
我选择使用对象作为 Payload 属性,因为它可能会根据命令类型而变化。但是,我面临一个问题,即在调试期间反序列化总是返回空值。
此外,我正在使用以下代码读取输入文件:
string inputFilePath = Path.Combine(Directory.GetCurrentDirectory(), "input.txt");
if (!File.Exists(inputFilePath))
{
Console.WriteLine($"Not found: {inputFilePath}");
return;
}
string jsonContent = await File.ReadAllTextAsync(inputFilePath);
List<Input> commands = JsonSerializer.Deserialize<List<Input>(jsonContent);
foreach (var commandLine in commands)
{
await ExecuteCommand(commandLine);
}
我实现这个方法是为了方便调试,但我也想知道如何直接从控制台读取输入文件路径。
有人可以帮助我解决反序列化问题并从控制台读取输入文件路径吗?
为此,我建议使用
dynamic
类型。要正确处理反序列化,您需要使用 Newtonsoft
nuget:
using Newtonsoft.Json;
var rawJson = @"[{""command"":""addItem"",""payload"":{""id"":1,""catId"":1,""sId"":1,""price"":1.2,""quantity"":1}}]";
var deserialized = JsonConvert.DeserializeObject<dynamic>(rawJson);
Console.WriteLine(deserialized[0].command);
Console.WriteLine(deserialized[0].payload.id);
Console.WriteLine(deserialized[0].payload.catId);
Console.WriteLine(deserialized[0].payload.sId);
Console.WriteLine(deserialized[0].payload.price);
Console.WriteLine(deserialized[0].payload.quantity);