使用List <interface> members </interface>反序列化嵌套类时发生奇怪的JsonSerializationException

时间:2014-07-25 23:04:08

标签: c# json serialization json.net

我正在尝试反序列化一些包含接口列表的复杂json(使用扩展JsonConverter的自定义转换器)。这些列表需要填充实现这些接口的类实例。

其中一些类实例也有自己的List<IInterface>成员来反序列化。这是这个json的片段(为简洁起见省略/改变了部分)。这个json是有效的,我对它的结构没有任何控制权。如果重要的话,它是使用Jackson解析器(服务器端用Java实现)制作的。

Features是我正在尝试反序列化的更大对象的成员。

"features": {
      "features": [
        {
          "@class": "com.company.project.business_logic.StandardFeatureArtifact",
          "feature_number": 1,
          "weight": 1,
          "player_bool": false,
          "override_bool": false,
          "play_bool": false,
          "evaluates_bool": false,
          "result_bool": false,
          "runners": [
            {
              "@class": "com.company.project.business_logic.StandardRunnableFeatureArtifact",
              "components": [
                {
                  "@class": "com.company.project.business_logic.components.GamePlayComponent",
                  "composition_order": 1,
                  "behaviours": [
                    {
                      "@class": "com.company.project.business_logic.behaviours.MultiplierBehaviour",
                      "order": 2,
                      "weight": 1,
                      "multiplier": 1
                    },
                    {
                      "@class": "com.company.project.business_logic.behaviours.RepeatActionBehaviour",
                      "order": 1,
                      "weight": 1,
                      "times_to_run": 8
                    },
                    {
                      "@class": "com.company.project.business_logic.behaviours.SymbolBehaviour",
                      "order": 0,
                      "weight": 1,
                      "symbol_to_fill": "STRING"
                    }
                }
            }
        }

功能是List<IFeature> 跑步者是List<IRunnableFeature> 组件是List<IRunnableComponent> 行为是List<IBehaviour>

我为以上4个成员列表中的每一个编写了自定义JsonConverters。这是我的一个自定义JsonConverters

的片段
class StandardFeatureArtifactConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return (objectType == typeof(StandardFeatureArtifact));
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            JArray jo = JArray.Load(reader);
            StandardFeatureArtifact sfa = new StandardFeatureArtifact();
            sfa.Runners = new List<IRunnableFeature>();
            foreach (JObject jobj in jo)
            {
                if (jobj["@class"].ToString().EndsWith("StandardRunnableFeatureArtifact"))
                {
                    StandardRunnableFeatureArtifact srfa = jobj.ToObject<StandardRunnableFeatureArtifact>(serializer);
                    sfa.Runners.Add(srfa);
                }
            }
            return sfa;
        }

我的WriteJson()此刻只抛出一个NotImplementedException(),因为我只是首先专注于反序列化。

所以这就是问题所在。我可以很好地反序列化到return sfa行。我得到一个有效的StandardFeatureArtifact对象,但我的行为定制转换器永远不会被执行,当上面的ReadJson()方法返回时,我得到一个JsonSerializationException {"Error setting value to 'Runners' on 'Company.JSON.StandardFeatureArtifact'."}

上述异常发生在我FeatureConverter的{​​{1}}课程的以下行中(除了ReadJson() ReadJson()之外的jo非常相似是FeatureConverter

JObject

这没有任何意义,因为当我踩过StandardFeatureArtifact sfa = jobj.ToObject<StandardFeatureArtifact>(serializer); 行时,sfa是一个有效的对象。

我很肯定我正在正确地注释和实现转换器,因为我有另一个return sfa成员(对于List<Interface>所属的同一外部对象),我正确地反序列化。它与Features之间的区别在于前者只有原始类型的成员。

  1. 有关导致该异常的原因的任何想法?
  2. 为什么我的行为转换器永远不会被执行?
  3. 我对嵌套json反序列化的理解是每个成员都以“深度优先”方式反序列化。此订单似乎适用于Features,但features -> StandardFeatureArtifact -> StandardRunnableFeatureArtifact -> GamePlayComponent已中断。

    如果需要更多信息,请与我们联系。这是我关于SO的第一篇文章。谢谢!

0 个答案:

没有答案