C# 如何将json数据反序列化为通用基础类System.Text.Json?

Ver*_*ple 2 c# json system.text.json

public class BaseRequest : IRequest
{
    public string Command { get; } = "";
}

public class GetRequest : IRequest
{
    public string Command => "get";

    public string Key { get; set; } = string.Empty;
}

public class SetRequest : IRequest
{
    public string Command => "set";

    public string Key { get; set; } = string.Empty;

    public string Value { get; set; } = string.Empty;
}
Run Code Online (Sandbox Code Playgroud)

现在这是一个 json 数据字符串,我需要将其转换为基类以确定它有哪个命令。

public class BaseRequest : IRequest
{
    public string Command { get; } = "";
}

public class GetRequest : IRequest
{
    public string Command => "get";

    public string Key { get; set; } = string.Empty;
}

public class SetRequest : IRequest
{
    public string Command => "set";

    public string Key { get; set; } = string.Empty;

    public string Value { get; set; } = string.Empty;
}
Run Code Online (Sandbox Code Playgroud)

我认为下面的代码可以工作。


var obj = JsonSerializer.Deserialize<BaseRequest>(jsonData);
Console.WriteLine(obj.Command);

if (obj.Command == "get") {
   var obj2 = JsonSerializer.Deserialize<GetRequest>(jsonData);
   // ...
} else if (obj.Command == "set") {
   var obj2 = JsonSerializer.Deserialize<SetRequest>(jsonData);
   // ...
} else {
   Console.WriteLine("Unknown command");
}
Run Code Online (Sandbox Code Playgroud)

但实际上obj's Command 是一个空字符串,最后程序陷入了最后一个if分支......

Dan*_*med 6

那是因为Command中的属性BaseRequest是只读的(您还没有为其声明 setter)。您需要将其修改为:

public class BaseRequest : IRequest
{
    public string Command { get; set; } = "";
}
Run Code Online (Sandbox Code Playgroud)

更多信息请参见“为什么要封装?” https://www.w3schools.com/cs/cs_properties.php部分

或者,如果您不想公开曝光,set您可以使用[JsonInclude]

public class BaseRequest
{
    [JsonInclude]
    public string Command { get; private set;  } = "";
} 
Run Code Online (Sandbox Code Playgroud)