将 JSON 反序列化为 C# class returns null
Deserializing JSON to a C# class returns null
我正在尝试将 JSON 文件反序列化为 c# class。但是,我的反序列化方法总是 returns null。
我的 JSON 文件看起来像这样-
{
"Products": [
{
"ProductID": 994,
"Name": "LL Bottom Bracket",
"ProductNumber": "BB-7421",
"ProductCategoryID": 9,
"ProductCategory": "Bottom Brackets",
"ProductModelID": 95,
"Description": "Chromoly steel."
},
{
"ProductID": 995,
"Name": "ML Bottom Bracket",
"ProductNumber": "BB-8107",
"ProductCategoryID": 9,
"ProductCategory": "Bottom Brackets",
"ProductModelID": 96,
"Description": "Aluminum alloy cups; large diameter spindle."
}
]
}
我正在尝试将其序列化到 class-
以下
public class Product
{
[JsonProperty("ProductID")]
public long ProductId { get; set; }
[JsonProperty("Name")]
public string Name { get; set; }
[JsonProperty("ProductNumber")]
public string ProductNumber { get; set; }
[JsonProperty("ProductCategoryID")]
public long ProductCategoryId { get; set; }
[JsonProperty("ProductCategory")]
public string ProductCategory { get; set; }
[JsonProperty("ProductModelID")]
public long ProductModelId { get; set; }
[JsonProperty("Description")]
public string Description { get; set; }
[JsonProperty("Color", NullValueHandling = NullValueHandling.Ignore)]
public string Color { get; set; }
}
public partial class Products
{
[JsonProperty("Products")]
public IEnumerable<Product> ProductsProducts { get; set; }
}
最后,我使用这段代码对其进行反序列化,但由于某种原因它 returns 为 null。有人可以帮忙吗?
public Products Get()
{
var jsonString = IO.File.ReadAllText("ProductsData.json");
var products = JsonSerializer.Deserialize<Products>(jsonString);
return products;
}
原因
您正在使用 Netwonsoft.Json
包中的 JsonProperty
属性,但是 System.Text.Json
命名空间中的内置 .NET Core/5 反序列化器。
我怎么知道的? Newtonsoft.Json 没有采用单个字符串的 JsonSerializer.Deserialize
重载,并且 .NET 不包含 JsonPropertyAttribute
.
这两个不兼容。 .NET 反序列化器忽略您的 [JsonProperty("Products")]
属性,在您的 JSON 中找不到名为 ProductsProducts
的 属性,因此,为该 属性 生成 null。
修复
要改用 Newtonsoft.Json 包中的反序列化器,请替换
var products = JsonSerializer.Deserialize<Products>(jsonString);
和
var products = JsonConvert.DeserializeObject<Products>(jsonString);
这是一个有效的 fiddle 代码:https://dotnetfiddle.net/27Tz4t
var products = JsonConvert.DeserializeObject<Products>(jsonString);
使用System.Text.Json
var products = JsonSerializer.Deserialize<Products>(jsonString);
public partial class Products
{
[System.Text.Json.Serialization.JsonPropertyName("Products")]
public IEnumerable<Product> ProductsProducts { get; set; }
}
如果您有 json 响应,请仅使用此站点进行转换 Json to c# class
// Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse);
public class Product {
public int ProductID { get; set; }
public string Name { get; set; }
public string ProductNumber { get; set; }
public int ProductCategoryID { get; set; }
public string ProductCategory { get; set; }
public int ProductModelID { get; set; }
public string Description { get; set; }
}
public class Root {
public List<Product> Products { get; set; }
}
public Products Get()
{
var jsonString = IO.File.ReadAllText("ProductsData.json");
var products = JsonSerializer.Deserialize<Root>(jsonString);
return products;
}
或使用visual studio选项
编辑-->选择性粘贴-->将JSON粘贴为类
public class Rootobject
{
public Product[] Products { get; set; }
}
public class Product
{
public int ProductID { get; set; }
public string Name { get; set; }
public string ProductNumber { get; set; }
public int ProductCategoryID { get; set; }
public string ProductCategory { get; set; }
public int ProductModelID { get; set; }
public string Description { get; set; }
}
public Products Get()
{
var jsonString = IO.File.ReadAllText("ProductsData.json");
var products = JsonSerializer.Deserialize<Rootobject>(jsonString);
return products;
}
我正在尝试将 JSON 文件反序列化为 c# class。但是,我的反序列化方法总是 returns null。 我的 JSON 文件看起来像这样-
{
"Products": [
{
"ProductID": 994,
"Name": "LL Bottom Bracket",
"ProductNumber": "BB-7421",
"ProductCategoryID": 9,
"ProductCategory": "Bottom Brackets",
"ProductModelID": 95,
"Description": "Chromoly steel."
},
{
"ProductID": 995,
"Name": "ML Bottom Bracket",
"ProductNumber": "BB-8107",
"ProductCategoryID": 9,
"ProductCategory": "Bottom Brackets",
"ProductModelID": 96,
"Description": "Aluminum alloy cups; large diameter spindle."
}
]
}
我正在尝试将其序列化到 class-
以下public class Product
{
[JsonProperty("ProductID")]
public long ProductId { get; set; }
[JsonProperty("Name")]
public string Name { get; set; }
[JsonProperty("ProductNumber")]
public string ProductNumber { get; set; }
[JsonProperty("ProductCategoryID")]
public long ProductCategoryId { get; set; }
[JsonProperty("ProductCategory")]
public string ProductCategory { get; set; }
[JsonProperty("ProductModelID")]
public long ProductModelId { get; set; }
[JsonProperty("Description")]
public string Description { get; set; }
[JsonProperty("Color", NullValueHandling = NullValueHandling.Ignore)]
public string Color { get; set; }
}
public partial class Products
{
[JsonProperty("Products")]
public IEnumerable<Product> ProductsProducts { get; set; }
}
最后,我使用这段代码对其进行反序列化,但由于某种原因它 returns 为 null。有人可以帮忙吗?
public Products Get()
{
var jsonString = IO.File.ReadAllText("ProductsData.json");
var products = JsonSerializer.Deserialize<Products>(jsonString);
return products;
}
原因
您正在使用 Netwonsoft.Json
包中的 JsonProperty
属性,但是 System.Text.Json
命名空间中的内置 .NET Core/5 反序列化器。
我怎么知道的? Newtonsoft.Json 没有采用单个字符串的 JsonSerializer.Deserialize
重载,并且 .NET 不包含 JsonPropertyAttribute
.
这两个不兼容。 .NET 反序列化器忽略您的 [JsonProperty("Products")]
属性,在您的 JSON 中找不到名为 ProductsProducts
的 属性,因此,为该 属性 生成 null。
修复
要改用 Newtonsoft.Json 包中的反序列化器,请替换
var products = JsonSerializer.Deserialize<Products>(jsonString);
和
var products = JsonConvert.DeserializeObject<Products>(jsonString);
这是一个有效的 fiddle 代码:https://dotnetfiddle.net/27Tz4t
var products = JsonConvert.DeserializeObject<Products>(jsonString);
使用System.Text.Json
var products = JsonSerializer.Deserialize<Products>(jsonString);
public partial class Products
{
[System.Text.Json.Serialization.JsonPropertyName("Products")]
public IEnumerable<Product> ProductsProducts { get; set; }
}
如果您有 json 响应,请仅使用此站点进行转换 Json to c# class
// Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse);
public class Product {
public int ProductID { get; set; }
public string Name { get; set; }
public string ProductNumber { get; set; }
public int ProductCategoryID { get; set; }
public string ProductCategory { get; set; }
public int ProductModelID { get; set; }
public string Description { get; set; }
}
public class Root {
public List<Product> Products { get; set; }
}
public Products Get()
{
var jsonString = IO.File.ReadAllText("ProductsData.json");
var products = JsonSerializer.Deserialize<Root>(jsonString);
return products;
}
或使用visual studio选项 编辑-->选择性粘贴-->将JSON粘贴为类
public class Rootobject
{
public Product[] Products { get; set; }
}
public class Product
{
public int ProductID { get; set; }
public string Name { get; set; }
public string ProductNumber { get; set; }
public int ProductCategoryID { get; set; }
public string ProductCategory { get; set; }
public int ProductModelID { get; set; }
public string Description { get; set; }
}
public Products Get()
{
var jsonString = IO.File.ReadAllText("ProductsData.json");
var products = JsonSerializer.Deserialize<Rootobject>(jsonString);
return products;
}