1

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

[
  [ //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.

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

4

3 回答 3

2

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

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

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

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

于 2012-05-30T11:40:49.467 回答
0

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

JSON 到 C#

于 2012-05-30T11:36:42.197 回答
0

您是否将 [Serializable] 属性添加到您的 DataContainer?

于 2012-05-30T11:38:00.827 回答