JsonSerializer.Deserialize 正在返回空对象
JsonSerializer.Deserialize is returning empty object
我有一个 webapi returns 一些 Json:
{"id":9,"businessName":"dummy","address":"pluto","products":[
{"id":762,"description":"Centralized needs-based website","price":1281.24,"stock":1600,"categories":[],"factory":null},
{"id":1027,"description":"Realigned 6th generation knowledge base","price":2398.16,"stock":19583,"categories":[],"factory":null},
{"id":1392,"description":"User-centric zero administration array","price":998.07,"stock":6124,"categories":[],"factory":null},
{"id":1800,"description":"Team-oriented reciprocal core","price":4422.95,"stock":17372,"categories":[],"factory":null},
{"id":2763,"description":"Sharable needs-based hierarchy","price":4122.98,"stock":17397,"categories":[],"factory":null},
{"id":6189,"description":"Re-engineered hybrid emulation","price":395.09,"stock":532,"categories":[],"factory":null}
]}
然后我尝试反序列化使用:
using var response = await _httpClient.GetAsync($"{GetApiRouteFromEntity(entity)}/{entity.GetId()}");
response.EnsureSuccessStatusCode();
var responseContent = await response.Content.ReadAsStringAsync();
T? item = JsonSerializer.Deserialize<T>(responseContent);
但这给了我一个 id 为 0 且所有其他属性为空的空工厂
Factory.cs
public class Factory : EntityBase
{
[DisplayName("ID")]
public int Id { get; set; }
[DisplayName("Nome Business")]
public string? BusinessName { get; set; }
[DisplayName("Indirizzo")]
public string? Address { get; set; }
[DisplayName("Prodotti")]
public virtual ICollection<Product> Products { get; set; }
public override string ToString()
{
return $"[{Id}] {BusinessName}";
}
}
Product.cs
public class Product : EntityBase
{
[DisplayName("ID")]
public int Id { get; set; }
[DisplayName("Descrizione")]
public string? Description { get; set; }
[DisplayName("Prezzo")]
public float Price { get; set; }
[DisplayName("Magazzino")]
public int Stock { get; set; }
[DisplayName("Categorie")]
public virtual ICollection<Category> Categories { get; set; }
[DisplayName("Fabbrica")]
public virtual Factory Factory { get; set; }
public override string ToString()
{
return $"[{Id}] {Description}";
}
}
EntityBase.cs
public abstract class EntityBase
{
public virtual object GetId()
{
return GetType().GetProperty("Id").GetValue(this);
}
}
我猜是因为产品中的工厂属性为空,但我不知道如何解决这个问题
来自docs:
By default, property names and dictionary keys are unchanged in the JSON output, including case.
您可以指定 属性 命名策略:
T? item = JsonSerializer.Deserialize<T>(responseContent, new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
});
对所有 JSON 属性 名称使用驼峰式大小写,或使用包含正确名称的 JsonPropertyNameAttibute
标记所有需要的属性:
public class Factory : EntityBase
{
[DisplayName("ID")]
[JsonPropertyName("id")] // and so on
public int Id { get; set; }
....
}
JSON 键都是驼峰式的,但是 类 中的道具是用帕斯卡式写的。例如。 businessName
对比 BusinessName
。因此 JsonSerializer 无法匹配它们。
您可以像这样初始化序列化程序以忽略大小写的差异:
var options = new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true
};
T? item = JsonSerializer.Deserialize<T>(responseContent, options);
有关更多信息,请参阅文档:https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-character-casing
我有一个 webapi returns 一些 Json:
{"id":9,"businessName":"dummy","address":"pluto","products":[
{"id":762,"description":"Centralized needs-based website","price":1281.24,"stock":1600,"categories":[],"factory":null},
{"id":1027,"description":"Realigned 6th generation knowledge base","price":2398.16,"stock":19583,"categories":[],"factory":null},
{"id":1392,"description":"User-centric zero administration array","price":998.07,"stock":6124,"categories":[],"factory":null},
{"id":1800,"description":"Team-oriented reciprocal core","price":4422.95,"stock":17372,"categories":[],"factory":null},
{"id":2763,"description":"Sharable needs-based hierarchy","price":4122.98,"stock":17397,"categories":[],"factory":null},
{"id":6189,"description":"Re-engineered hybrid emulation","price":395.09,"stock":532,"categories":[],"factory":null}
]}
然后我尝试反序列化使用:
using var response = await _httpClient.GetAsync($"{GetApiRouteFromEntity(entity)}/{entity.GetId()}");
response.EnsureSuccessStatusCode();
var responseContent = await response.Content.ReadAsStringAsync();
T? item = JsonSerializer.Deserialize<T>(responseContent);
但这给了我一个 id 为 0 且所有其他属性为空的空工厂
Factory.cs
public class Factory : EntityBase
{
[DisplayName("ID")]
public int Id { get; set; }
[DisplayName("Nome Business")]
public string? BusinessName { get; set; }
[DisplayName("Indirizzo")]
public string? Address { get; set; }
[DisplayName("Prodotti")]
public virtual ICollection<Product> Products { get; set; }
public override string ToString()
{
return $"[{Id}] {BusinessName}";
}
}
Product.cs
public class Product : EntityBase
{
[DisplayName("ID")]
public int Id { get; set; }
[DisplayName("Descrizione")]
public string? Description { get; set; }
[DisplayName("Prezzo")]
public float Price { get; set; }
[DisplayName("Magazzino")]
public int Stock { get; set; }
[DisplayName("Categorie")]
public virtual ICollection<Category> Categories { get; set; }
[DisplayName("Fabbrica")]
public virtual Factory Factory { get; set; }
public override string ToString()
{
return $"[{Id}] {Description}";
}
}
EntityBase.cs
public abstract class EntityBase
{
public virtual object GetId()
{
return GetType().GetProperty("Id").GetValue(this);
}
}
我猜是因为产品中的工厂属性为空,但我不知道如何解决这个问题
来自docs:
By default, property names and dictionary keys are unchanged in the JSON output, including case.
您可以指定 属性 命名策略:
T? item = JsonSerializer.Deserialize<T>(responseContent, new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
});
对所有 JSON 属性 名称使用驼峰式大小写,或使用包含正确名称的 JsonPropertyNameAttibute
标记所有需要的属性:
public class Factory : EntityBase
{
[DisplayName("ID")]
[JsonPropertyName("id")] // and so on
public int Id { get; set; }
....
}
JSON 键都是驼峰式的,但是 类 中的道具是用帕斯卡式写的。例如。 businessName
对比 BusinessName
。因此 JsonSerializer 无法匹配它们。
您可以像这样初始化序列化程序以忽略大小写的差异:
var options = new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true
};
T? item = JsonSerializer.Deserialize<T>(responseContent, options);
有关更多信息,请参阅文档:https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-character-casing