无法使用 JSON.NET 递归反序列化 Class 层次结构
Cannot Deserialize Recursively a Class Hierarchy Using JSON.NET
我有这样的 class 层次结构:
class Rule { }
class Condition { List<Rule> Rules { get; set; } }
忘掉其余的属性。我需要使用自定义 JsonConverter 从 JSON 字符串反序列化。问题是,我有每个特定案例的代码,但我不能递归地使用它 运行,为了处理规则 属性,它的每个元素也可以是一个条件。
我的代码如下所示(ReadJson 方法):
var jo = JObject.Load(reader);
Rule rule = null;
if (jo["condition"] == null)
{
rule = new Rule();
//fill the properties for rule
}
else
{
rule = new Condition();
//I now want the converter to go through all the values in jo["rules"] and turn them into Rules or Conditions
}
实现此目标的最佳方法是什么?我尝试获取剩余部分的JSON,如果发现该对象是一个条件:
var json = jo.GetValue("rule").ToString();
但是我不能像这样反序列化它,它抛出一个异常:
var rules = JsonConvert.DeserializeObject<Rule[]>(json, this);
异常是:JsonReaderException:从 JsonReader 读取 JObject 时出错。当前 JsonReader 项不是对象:StartArray。路径 '',第 1 行,位置 1.
有什么想法吗?
你离它的工作不远了。根据 JSON 中是否存在 condition
属性 实例化正确类型的对象后,您可以使用 serializer.Populate
方法填充实例。这应该自动处理递归。您确实需要将新的 JsonReader
实例传递给 Populate
,您可以使用 jo.CreateReader()
.
创建它
转换器应如下所示:
public class RuleConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(Rule).IsAssignableFrom(objectType);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var jo = JObject.Load(reader);
Rule rule = null;
if (jo["condition"] == null)
{
rule = new Rule();
}
else
{
rule = new Condition();
}
serializer.Populate(jo.CreateReader(), rule);
return rule;
}
public override bool CanWrite
{
get { return false; }
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
这是一个工作示例:https://dotnetfiddle.net/SHctMo
我有这样的 class 层次结构:
class Rule { }
class Condition { List<Rule> Rules { get; set; } }
忘掉其余的属性。我需要使用自定义 JsonConverter 从 JSON 字符串反序列化。问题是,我有每个特定案例的代码,但我不能递归地使用它 运行,为了处理规则 属性,它的每个元素也可以是一个条件。 我的代码如下所示(ReadJson 方法):
var jo = JObject.Load(reader);
Rule rule = null;
if (jo["condition"] == null)
{
rule = new Rule();
//fill the properties for rule
}
else
{
rule = new Condition();
//I now want the converter to go through all the values in jo["rules"] and turn them into Rules or Conditions
}
实现此目标的最佳方法是什么?我尝试获取剩余部分的JSON,如果发现该对象是一个条件:
var json = jo.GetValue("rule").ToString();
但是我不能像这样反序列化它,它抛出一个异常:
var rules = JsonConvert.DeserializeObject<Rule[]>(json, this);
异常是:JsonReaderException:从 JsonReader 读取 JObject 时出错。当前 JsonReader 项不是对象:StartArray。路径 '',第 1 行,位置 1.
有什么想法吗?
你离它的工作不远了。根据 JSON 中是否存在 condition
属性 实例化正确类型的对象后,您可以使用 serializer.Populate
方法填充实例。这应该自动处理递归。您确实需要将新的 JsonReader
实例传递给 Populate
,您可以使用 jo.CreateReader()
.
转换器应如下所示:
public class RuleConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(Rule).IsAssignableFrom(objectType);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var jo = JObject.Load(reader);
Rule rule = null;
if (jo["condition"] == null)
{
rule = new Rule();
}
else
{
rule = new Condition();
}
serializer.Populate(jo.CreateReader(), rule);
return rule;
}
public override bool CanWrite
{
get { return false; }
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
这是一个工作示例:https://dotnetfiddle.net/SHctMo