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

时间:2014-05-21 17:23:42

标签: c# json serialization types

我试图在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; }
}

这种方法的工作原理是行中的普通字符串被反序列化,但是,即使我试图将它们作为KnownType放下,RowObject也似乎无法识别。当我查看反序列化的List<object>行时,RowObject似乎是一个空白对象,在调试器中显示为{object}

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

是否可以反序列化不同类型的JSON数组?

1 个答案:

答案 0 :(得分:0)

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