Json.Net - 反序列化具有 "dynamic" 属性的对象
Json.Net - Deserialize object with "dynamic" properties
我得到了以下Json数据
{
"HasErrors": false,
"Includes": {
"Products": {
"091006": {
"hej" : "tja"
},
"091026": {
"hej" : "tjafsafsa"
}
}
}
}
动态 JSON 我的意思是产品 class 的属性发生了变化,所以我不能像使用 [=58] 一样在 c# class 中对它们进行硬编码=] 例如。
示例:
{
"HasErrors": false,
"Includes": {
"Products": {
"091006": {
"hej" : "tja"
},
"091026": {
"hej" : "tjafsafsa"
}
}
}
}
另一个例子:
{
"HasErrors": false,
"Includes": {
"Products": {
"091126": { //CHANGED
"hej" : "tja"
},
"091043226": { //CHANGED
"hej" : "tjafsafsa"
}
}
}
}
我在 .NET
中构建了以下 classes
Response.cs
public class Response<T> where T : new()
{
[JsonProperty("hasErrors")]
public bool HasErrors { get; set; }
[JsonProperty("includes")]
public Includes<T> Includes { get; set; }
}
Includes.cs
public class Includes<T> where T : new()
{
[JsonProperty("products")]
public ProductRoot Products { get; set; }
}
ProductRoot.cs
public class ProductRoot
{
[JsonProperty("products")]
public Dictionary<string, Product> Products { get; set; }
}
Product.cs
public class Product
{
[JsonProperty("hej")]
public string Hej { get; set; }
}
然后我尝试像这样反序列化它:
var hej = JsonConvert.DeserializeObject<Response<Product>>(json_from_above_as_string);
然后我得到这个错误:
无法从 System.String 转换或转换为 www.Models.Externals.Product。
[JsonSerializationException:将值“091006”转换为类型 'www.Models.Externals.Product' 时出错。路径 'Includes.ProductsOrder[0]',第 1 行,位置 15173。]
你们知道我做错了什么吗?
我通过删除 ProductRoot class.
解决了这个问题
现在看起来像这样:
public class Response<T> where T : new()
{
[JsonProperty("hasErrors")]
public bool HasErrors { get; set; }
[JsonProperty("includes")]
public Includes<T> Includes { get; set; }
}
public class Includes<T> where T : new()
{
[JsonProperty("products")]
public Dictionary<string, Product>Products { get; set; }
}
我已经成功地实例化了一个 <Response<Product>>
类型的对象并将其序列化以了解幕后发生的事情,例如,我从中得到的 JSON 是如下:
{
"hasErrors":false,
"includes":{
"products":{
"products":{
"091006":{
"hej":"tja"
}
}
}
}
}
这表明您的 JSON 根本不符合您的对象模型。你可以做几件事。要么将您的 JSON 格式更改为类似于上面的格式,要么将您的对象模型更改为以下内容:
public class Response<T> where T : new()
{
[JsonProperty("hasErrors")]
public bool HasErrors { get; set; }
[JsonProperty("includes")]
public Includes<T> Includes { get; set; }
}
public class Includes<T> where T : new()
{
[JsonProperty("products")]
public Dictionary<string, T> Products { get; set; }
}
public class Product
{
[JsonProperty("hej")]
public string Hej { get; set; }
}
我得到了以下Json数据
{
"HasErrors": false,
"Includes": {
"Products": {
"091006": {
"hej" : "tja"
},
"091026": {
"hej" : "tjafsafsa"
}
}
}
}
动态 JSON 我的意思是产品 class 的属性发生了变化,所以我不能像使用 [=58] 一样在 c# class 中对它们进行硬编码=] 例如。
示例:
{
"HasErrors": false,
"Includes": {
"Products": {
"091006": {
"hej" : "tja"
},
"091026": {
"hej" : "tjafsafsa"
}
}
}
}
另一个例子:
{
"HasErrors": false,
"Includes": {
"Products": {
"091126": { //CHANGED
"hej" : "tja"
},
"091043226": { //CHANGED
"hej" : "tjafsafsa"
}
}
}
}
我在 .NET
中构建了以下 classesResponse.cs
public class Response<T> where T : new()
{
[JsonProperty("hasErrors")]
public bool HasErrors { get; set; }
[JsonProperty("includes")]
public Includes<T> Includes { get; set; }
}
Includes.cs
public class Includes<T> where T : new()
{
[JsonProperty("products")]
public ProductRoot Products { get; set; }
}
ProductRoot.cs
public class ProductRoot
{
[JsonProperty("products")]
public Dictionary<string, Product> Products { get; set; }
}
Product.cs
public class Product
{
[JsonProperty("hej")]
public string Hej { get; set; }
}
然后我尝试像这样反序列化它:
var hej = JsonConvert.DeserializeObject<Response<Product>>(json_from_above_as_string);
然后我得到这个错误:
无法从 System.String 转换或转换为 www.Models.Externals.Product。
[JsonSerializationException:将值“091006”转换为类型 'www.Models.Externals.Product' 时出错。路径 'Includes.ProductsOrder[0]',第 1 行,位置 15173。]
你们知道我做错了什么吗?
我通过删除 ProductRoot class.
解决了这个问题现在看起来像这样:
public class Response<T> where T : new()
{
[JsonProperty("hasErrors")]
public bool HasErrors { get; set; }
[JsonProperty("includes")]
public Includes<T> Includes { get; set; }
}
public class Includes<T> where T : new()
{
[JsonProperty("products")]
public Dictionary<string, Product>Products { get; set; }
}
我已经成功地实例化了一个 <Response<Product>>
类型的对象并将其序列化以了解幕后发生的事情,例如,我从中得到的 JSON 是如下:
{
"hasErrors":false,
"includes":{
"products":{
"products":{
"091006":{
"hej":"tja"
}
}
}
}
}
这表明您的 JSON 根本不符合您的对象模型。你可以做几件事。要么将您的 JSON 格式更改为类似于上面的格式,要么将您的对象模型更改为以下内容:
public class Response<T> where T : new()
{
[JsonProperty("hasErrors")]
public bool HasErrors { get; set; }
[JsonProperty("includes")]
public Includes<T> Includes { get; set; }
}
public class Includes<T> where T : new()
{
[JsonProperty("products")]
public Dictionary<string, T> Products { get; set; }
}
public class Product
{
[JsonProperty("hej")]
public string Hej { get; set; }
}