System.Text.Json.Serialization 似乎不适用于具有嵌套类的 JSON

ASA*_*SAP 5 c# json .net-5 system.text.json blazor-webassembly

如何定义仅使用 System.Text.Json.Serialization 工作的类?

使用 Microsoft 的 Newtonsoft 反序列化新替代方案目前不适用于嵌套类,因为在反序列化 JSON 文件时,所有属性都设置为 null。使用 Newtosonsoft 的 Json property 属性[JsonProperty("Property1")]来维护属性的值。

谢谢!

public class Class1
{
    [JsonProperty("Property1")]
    public string Property1 { get; set; }
}
    
Run Code Online (Sandbox Code Playgroud)

使用 Visual Studio 的粘贴 JSON 到类进行粘贴以创建类:

public class Rootobject
{
    public string Database { get; set; }
    public Configuration Configuration { get; set; }
}

public class Configuration
{
    public Class1 Class1 { get; set; }
    public Class2 Class2 { get; set; }
    public Class3 Class3 { get; set; }
}

public class Class1
{
    public string Property1 { get; set; }
}

public class Class2
{
    public string Property2 { get; set; }
}

public class Class3
{
    public string Property3 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

问题是使用 System.Text.Json.Serialization时,嵌套类的属性设置为 null。

{
  "property1": null
}
Run Code Online (Sandbox Code Playgroud)

csharp2json

使用 Newtonsoft 解串器可与[JsonProperty("Configuration")]

public class Class1
{
    [JsonProperty("Property1")]
    public string Property1 { get; set; }
}

public class Class2
{
    [JsonProperty("Property2")]
    public string Property2 { get; set; }
}

public class Class3
{
    [JsonProperty("Property3")]
    public string Property3 { get; set; }
}

public class Configuration
{
    [JsonProperty("Class1")]
    public Class1 Class1 { get; set; }

    [JsonProperty("Class2")]
    public Class2 Class2 { get; set; }

    [JsonProperty("Class3")]
    public Class3 Class3 { get; set; }
}

public class RootObject
{
    [JsonProperty("Database")]
    public string Database { get; set; }

    [JsonProperty("Configuration")]
    public Configuration Configuration { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

hal*_*ldo 5

看来您正在将[JsonProperty]来自 的属性与 混合Newtonsoft.Json在一起System.Text.Json。那是行不通的。

中的等效属性System.Text.Json[JsonPropertyName].

您还需要匹配大小写(对于System.Text.Json,这就是属性被评估为 null 的原因)。从您引用的文档中:

默认情况下,属性名称匹配区分大小写。您可以指定不区分大小写。

因此,如果您的 json 属性如下所示:

{
    "property1": "abc"
}
Run Code Online (Sandbox Code Playgroud)

那么,你的类应该如下所示:

public class Class1
{
    [JsonPropertyName("property1")]
    public string Property1 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

请注意,属性中的“property1”是小写的JsonPropertyName

查看此在线演示

要指定不区分大小写,您可以PropertyNameCaseInsensitive在序列化器选项中使用:

var options = new JsonSerializerOptions
{
    PropertyNameCaseInsensitive = true,
};
var data = JsonSerializer.Deserialize<Root>(json, options);
Run Code Online (Sandbox Code Playgroud)