反序列化呈现为不同类型的节点

原边

我正在遍历一个JSON文件的文件夹,并且试图从中提取一些信息。但是,我发现这样做非常困难。

我已经开始构建要反序列化的对象。我有一个通常会反序列化为对象的特定节点,但是当它为空时,它将显示为一个空数组。definition在下面的示例JSON中查看字段:

{
  "name": "Example",
  "description": "Example JSON",
  "properties": {
    "foo": "bar",
    "foo1": "bar2",
    "foo3": "bar4"
  },
  "stages": {
    "This is a stage": {
      "stageInfo1": "blah",
      "stageInfo2": "blah",
      "integration": {
        "x": "x",
        "y": "y",
        "z": "z",
        "definition": []
      }
    },
    "Another Stage": {
      "stageInfo1": "blah",
      "stageInfo2": "blah",
      "integration": {
        "x": "x",
        "y": "y",
        "z": "z",
        "definition": {
          "5a4d7de4c6518": {
            "Editable": true,
            "ID": "5a4d7de4c6518",
            "Name": "My example"
          }
        }
      }
    }
  }
}

由于定义名称可以更改(在这种情况下为5a4d7de4c6518),我认为最好使用字典,但是在显示空数组时会引发错误。

 [JsonProperty("definition")]
 public Dictionary<string, Definition> definition;

错误:

Newtonsoft.Json.dll中发生了类型为'Newtonsoft.Json.JsonSerializationException'的未处理异常

附加信息:无法将当前JSON数组(例如[1,2,3])反序列化为类型'System.Collections.Generic.Dictionary`2 [System.String,JsonProcessReader.Models.Stages + IntegrationDefinition]',因为该类型需要一个JSON对象(例如{“ name”:“ value”})正确反序列化。

要解决此错误,可以将JSON更改为JSON对象(例如{“ name”:“ value”}),也可以将反序列化类型更改为数组,或者将实现集合接口的类型(例如ICollection,IList)更改为List,例如List从JSON数组反序列化。还可以将JsonArrayAttribute添加到类型中,以强制其从JSON数组反序列化。

布赖恩·罗杰斯

空数组与字典结构不兼容,这会引起您所看到的错误。由于您似乎无法轻松更改JSON,因此需要使用aJsonConverter来处理这种情况。这是一个应该为您服务的通用名称:

class TolerantObjectConverter<T> : JsonConverter where T: new()
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(T);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JToken token = JToken.Load(reader);
        object result = new T();
        if (token.Type == JTokenType.Object)
        {
            serializer.Populate(token.CreateReader(), result);
        }
        return result;
    }

    public override bool CanWrite
    {
        get { return false; }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

此转换器的工作方式是将相关的JSON临时加载到中JToken,然后在尝试转换之前先检查它是否实际上是对象。因此,如果它是无法正确转换的数组或其他令牌类型,它将返回一个空T实例。

要使用转换器,只需将[JsonConverter]属性添加到字典属性中,如下所示:

public class Integration
{
    ...
    [JsonConverter(typeof(TolerantObjectConverter<Dictionary<string, Definition>>))]
    public Dictionary<string, Definition> definition { get; set; }
}

这是一个有效的演示:https : //dotnetfiddle.net/83dQoC

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

JavaScriptSerializer 反序列化不同类型的 Json 数组

JSON Newtonsoft C# 反序列化不同类型的对象列表

在Jackson中反序列化具有相同名称但不同类型的属性?

如何反序列化具有不同类型的集合?

反序列化可以具有不同类型的属性名称

从具有不同类型的HttpWebResponse GetResponseStream反序列化XML

反序列化具有不同类型的GenericObject <T>的列表

反序列化具有不同类型的JSON数组

使用 Spring WebClient,我如何反序列化不同类型的成功和失败响应?

如何在返回不同类型的同时反序列化 JSON?

具有不同类型的字段的 JSON 反序列化(使用 Jackson 和 Scala)

反序列化包含不同类型对象的JSON数组

在C#中反序列化具有不同类型名称的XML元素

GSON在Android中使用两种不同类型的对象反序列化列表

如何在具有相同类型子节点的 c# 中反序列化 XML

如何反序列化包含相同键名但使用不同类型的JSON文件(使用Google JSON)?

如何序列化不同类型的字段?

反序列化不同对象类型的数组

使用不同的propertyValue类型反序列化json

使用Jackson将不同类型反序列化为单个字段

改造:将对象列表反序列化为不同类型

如何使用Retrofit / Gson在JSON中反序列化相同类型但具有不同字段名称的对象列表?

反序列化派生类型

反序列化各种JSON类型

反序列化动态json类型

使用Bond反序列化xml抛出System.IO.InvalidDataException:意外的节点类型

如何处理在网络上传递不同类型的序列化消息

不同类型的WCF SOAP有效内容内容序列化

C#JSON-序列化具有相同属性的不同类型的多个对象