【问题标题】:Deserializing complex JSON contain array of inherited object types反序列化复杂 JSON 包含继承对象类型的数组
【发布时间】:2015-05-21 15:13:13
【问题描述】:

我创建了一个名为RESTObjectBase 的类。该类由任意数量的其他类继承,包括人员、地址、电话号码等信息。

我创建了一个List<RestObjectBase>,其中包含一个或多个此类对象,并通过 REST 调用将其传递回前端。

返回的JSON如下:

{
   "Items":[
      {
         "__type":"AnyObjectInheritedFromBaseClass",
         "ObjectType":3,
         "First_Name":"",
         "Last_Name":"",
      }
   ],
   "Status":0
}

我正在尝试在另一端反序列化它。我遇到了多个错误,包括“类型不能为空”,但这不是我的问题。

有没有办法将这种复杂的对象反序列化为原始类/列表。我为什么苦苦挣扎是因为它是最终继承 RESTObjectBase 的对象数组,而且反序列化看起来不够聪明,无法做到这一点。

反序列化的前端可以是任何设备或平台,所以我不能简单地使用 JSON.NET 之类的东西,因为它不受任何地方的支持。

我什至很乐意解构 JSON 并分别序列化数组中的每个项目,但我也不知道如何做到这一点。我可以使用该类型来确定如何反序列化它。

任何帮助将不胜感激。

【问题讨论】:

  • 您使用的是什么序列化程序? “__type”参数的存在表明它是DataContractJsonSerializerJavaScriptSerializer
  • 查看 VS 中的“将 JSON 粘贴为类”功能。 blogs.msdn.com/b/webdev/archive/2012/12/18/…
  • 谢谢。这两个都让我回到了正确的道路上。那和 2 个小时的睡眠 :)。

标签: c# json serialization


【解决方案1】:

关键在于使用正确的序列化程序。我正在使用 DataContractJsonSerializer 进行序列化,因此对反序列化也进行了同样的操作,并且它按预期工作。

        RESTResponse rr2 = null;

        using (MemoryStream ms = new MemoryStream())
        {
            var writer = new StreamWriter(ms);
            writer.Write(textBox1.Text);
            writer.Flush();
            ms.Position = 0;

            DataContractJsonSerializer s = new DataContractJsonSerializer(typeof(RESTResponse));

            rr2 = (RESTResponse)s.ReadObject(ms);
        }

虽然我计划在移动设备上的许多不同平台上执行此操作,但我计划使用 Xamarin,因此我应该能够执行相同的代码。

这也意味着我可以使用 JSON.NET。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-11
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多