无法使用JSON.NET递归反序列化类层次结构

时间:2017-11-08 16:25:38

标签: json.net json-deserialization

我有这样的类层次结构:

class Rule { }
class Condition { List<Rule> Rules { get; set; } }

忘记剩下的属性。我需要使用自定义JsonConverter从JSON字符串反序列化。问题是,我有每个特定情况的代码,但我不能递归运行,为了处理Rules属性,它的每个元素也可以是一个条件。 我的代码看起来像这样(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。路径&#39;&#39;,第1行,第1位。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

你离它不远了。根据JSON中是否存在<script type="text/javascript"> $('.rating-votes').likeDislike({ reverseMode: true, click: function (value, l, d, event) { var likes = $(this.element).find('.likes'); var dislikes = $(this.element).find('.dislikes'); var comid = $(".vbtn").val(); var data = {comid:comid}; if(value === 1){ data.likes = true; }else{ data.dislikes = true; } $.ajax({ url: '', type: 'POST', data: data, success: function (data) { likes.text(parseInt(likes.text()) + l); dislikes.text(parseInt(dislikes.text()) + d); } }); } }); </script> <script src="like-dislike.js"></script> 属性实例化正确类型的对象后,可以使用condition方法填充实例。这应该自动处理递归。您需要将新的serializer.Populate实例传递给JsonReader,您可以使用Populate创建该实例。

以下是转换器的外观:

jo.CreateReader()

以下是一个工作示例:https://dotnetfiddle.net/SHctMo