在C#中反序列化不同类型对象的多个JSON数组

时间:2012-05-30 11:31:55

标签: c# java asp.net json arrays

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

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

所以我创建了一些Dummy-classes,它们对数组中的对象具有相应的属性,这有用:

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.

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

3 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

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

JSON to C#

答案 2 :(得分:0)

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