C# 如何在.Net中反序列化包含不同类型的JSON数组?

C# 如何在.Net中反序列化包含不同类型的JSON数组?,c#,json,serialization,types,C#,Json,Serialization,Types,我正在尝试反序列化C#中的JSON对象数组。数组表示表中的一行,主要由普通字符串组成。但是,数组中的一个或多个项可能不是字符串,而是JSON对象本身,例如 "rows":[[{"date":"20140521","category":"one"},"data","moredata","evenmoredata"],...] 或者,对于来自服务器的不同响应,顺序可能不同 "rows":[["data","moredata",{"date":"20140521","category":"one"}

我正在尝试反序列化C#中的JSON对象数组。数组表示表中的一行,主要由普通字符串组成。但是,数组中的一个或多个项可能不是字符串,而是JSON对象本身,例如

"rows":[[{"date":"20140521","category":"one"},"data","moredata","evenmoredata"],...]
或者,对于来自服务器的不同响应,顺序可能不同

"rows":[["data","moredata",{"date":"20140521","category":"one"},"evenmoredata"],...]
我试图将其视为对象列表,下面是一个名为RowObject的已知类型:

[DataContract]
[KnownType(typeof(RowObject))]
public class Table
{
    // other members to deserialize

    [DataMember(Name = "rows")]
    public List<List<object>> Rows { get; set; }
}

[DataContract]
public class RowObject
{
    [DataMember(Name = "date")]
    public DateTime date { get; set; }

    [DataMember(Name = "category")]
    public string category { get; set; }
}
[DataContract]
[KnownType(typeof(RowObject))]
公共类表
{
//要反序列化的其他成员
[DataMember(Name=“rows”)]
公共列表行{get;set;}
}
[数据合同]
公共类行对象
{
[数据成员(Name=“date”)]
公共日期时间日期{get;set;}
[DataMember(Name=“category”)]
公共字符串类别{get;set;}
}
这种方法的工作原理是,行中的普通字符串被反序列化,但是行对象似乎无法识别,即使我尝试将它们作为
KnownType
。当我查看反序列化的
列表
行时,RowObject似乎是一个空白对象,在调试器中显示为
{object}

在项目的其他地方,我已经设法使用已知类型和派生类型来实现这一点,但是处理普通字符串的问题让我陷入了困境。我已经看了一下,这看起来很相似,但我的问题是,我不知道列表中的哪些元素将是复杂类型。另外,我只是在整个项目中使用.Net
DataContractJsonSerializer
,所以我希望尽可能避免使用第三方库


可以像这样反序列化不同类型的JSON数组吗?

在DataContractJsonSerializerSettings中将
EmitTypeInformation
设置为
EmitTypeInformation。始终在服务器端。这样,您就可以在json字符串中获得有关对象类型的信息。

是否可以清除列表中的非复杂类型成员,然后根据需要对其进行处理?对于每种类型,只需将其他成员放入不同的数组中,或者根据需要放弃?然后使用列表的排序方法。如果json字符串中没有任何类型信息,您希望序列化程序如何反序列化为RowObject?我猜我天真地希望,如果序列化程序看到它有一些已知类型,它会尝试生成一个RowObject,而不是“基类”对象。没那么容易!谢谢你。我无法完全按照您的回答更改服务器端,但它帮助了很多。最后,服务器现在会发送一个包含类型信息的单独列表,我用JSON.Net编写了一个自定义反序列化程序,用正确的类型填充我的列表。