【问题标题】:Deserializing multiple JSON-arrays of different types of objects in C#在 C# 中反序列化不同类型对象的多个 JSON 数组
【发布时间】:2012-06-04 15:19:07
【问题描述】:

我有一个 JSON 字符串,其中包含固定数量的不同对象数组(在 Java 中使用 JSONObjectsJSONArrays 创建):

[
  [ //The first type of object
    {
      "Initials":"MUS"
    },
    {
      "Initials":"NA"
    }
  ],
  [ //The second type
    {
      "ToolId":17
    },
    {
      ...
    }
  ]
  ... //etc.
]

所以我创建了一些虚拟类,它们具有与数组中的对象对应的属性,它们有效:

private class DummyEmployee
{
    public string Initials { get; set; }
}
//etc.

但我不知道应该如何设计容器类。我就是这样做的:

private class DataContainer
{
    public List<DummyEmployee> Employees { get; set; }
    public List<DummySecondType> SecondTypes { get; set; }
    //etc.
}

这就是我尝试反序列化 JSON 数据的方式:

JavaScriptSerializer ser = new JavaScriptSerializer();

string jsonDataFromClient = ...;

DataContainer jsonData = ser.Deserialize<DataContainer>(jsonDataFromClient);

而且它不起作用。传递数据时出现以下错误: Type 'GUI.ValidateLoginData+DataContainer' is not supported for deserialization of an array.

我找不到关于反序列化不同对象数组的任何其他主题。

【问题讨论】:

标签: c# java asp.net json arrays


【解决方案1】:

使用此在线工具为您创建 C# 类。然后,您可以根据需要微调类(名称等)。至少,您可以了解您正在创建的模型类是否正确。

JSON to C#

【讨论】:

  • 我试过了,只是因为我想看看它是否能让我了解我正在寻找的设计 - 但它认为 JSON 数据无效,它确实如此。
  • 无论您使用哪个库.. 不同类型的对象数组都不是有效的 c# 对象。除非你切换到 c# 4.0 中引入的动态
  • @KapilKhandelwal 如果你想要的话,这里就是:[[{"Initials":"ABV"},{"Initials":"NA"}],[],[{"Content": "Test","ToolId":17,"WrittenAtTime":"Sat Feb 25 06:10:16 CET 2012","Initials":"ABV"}]]
【解决方案2】:

您是否在 DataContainer 中添加了 [Serializable] 属性?

【讨论】:

  • 没有。我刚刚尝试过,但没有任何区别。虚拟类在没有它的情况下也可以工作,所以我认为也没有必要。
【解决方案3】:

是的,我不会工作
请注意,在您的 javascript 对象中基本上是一个数组,并且因为 javascript 是一种动态语言,所以它是一个有效的数组
因为 c# 不是,所以数组(或列表)必须包含相同类型的对象。但是,如果您仍然需要实现此功能并且您可以控制 JSON 结构,请将其编辑为此

{
  Employees:[ //The first type of object
    {
      "Initials":"MUS"
    },
    {
      "Initials":"NA"
    }
  ],
  SecondTypes:[ //The second type
    {
      "ToolId":17
    },
    {
      ...
    }
  ]
  ... //etc.
}

并且您当前的 c# 对象可能会正确映射。

如果您无法控制 JSON 结构,那么您必须在 c# 中使用动态对象
更新:-对于您无法控制 JSON 结构的情况(或者您不想编辑它)。
尝试将您的 JSON 对象反序列化为动态类型的数组
UPDATE 2:- 因为您很好奇尝试将现有的 JSON 结构反序列化为 List&lt;List&lt;dynamic&gt;&gt; 类型的对象,虽然我没有尝试过但是它应该可以正常工作。
但是,此解决方案的一个缺点是您将无法区分两种不同类型的对象,即EmployeeSecondTypes

【讨论】:

  • 不用动态也可以做到...stackoverflow.com/questions/2962551/…
  • 我认为,如果我在创建(序列化)此 JSON 字符串的 Java 代码中使用 JSONObject 而不是 JSONArray 来保存它们,这可能是可能的。但是您确定没有针对其中包含 JSONArrays 的 JSONArrays 的解决方案吗?
  • @jjchiw 那么,您是在建议List&lt;List&lt;X&gt;&gt; 吗?在那种情况下,X 会是什么?
  • @AskeBisgaard - 反序列化一个或多个数组不会有任何问题。问题是内部数组的类型不同,所以像这样的解决方案 List>() 不会做因为 x 不是常数..
  • 您的解决方案有效,但我仍然很好奇是否可以在不提供每个数组属性名称的情况下执行此操作。我现在就给你答案。
猜你喜欢
  • 1970-01-01
  • 2021-01-30
  • 1970-01-01
  • 2015-04-15
  • 1970-01-01
  • 2016-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多