DataContractJsonSerializer:序列化对象或数组(可以是两者)

时间:2014-04-28 06:38:49

标签: c# json

我正在访问tomtom json api,当发生错误时,api会返回一个对象数组或单个对象。

示例:

[{"driverno": "...

错误示例:

{"errorCode": "8011","errorMsg": "request quota reached, error code: 8011"}

访问数据WebRequest,WebResponse并返回一个流,然后可以将其传递给DataContractJsonSerializer。但是,我无法创建一个序列化类,它接受两种形式的JSON,并且流不能被传递两次,因为不支持搜索功能。

有没有办法,创建一个支持两种类型的JSON输入的序列化类?

1 个答案:

答案 0 :(得分:0)

我找到了一种解决方法,我将Stream复制到MemoryStream,从而可以进行搜索。我没有完全满意解决方案,因为它会进行Stream复制和DataContractJsonSerializer两次。

样品:

string text = File.ReadAllText(PAHT);
text  = Regex.Replace(text, "\\{[\\n\\r ]*\"__type", "{\"__type");

// copy to MemoryStream
using (MemoryStream dataStream = new MemoryStream(Encoding.UTF8.GetBytes(text)))
{
    DataContractJsonSerializer errorDeserializer = new DataContractJsonSerializer(typeof(RequestError));
    RequestError errorSerilaized = (RequestError)errorDeserializer.ReadObject(dataStream);

    // check if an error happened
    if (errorSerilaized.errorCode == null)
    {
        // seek the stream to position 0
        dataStream.Position = 0;

        DataContractJsonSerializer _deserializer = new DataContractJsonSerializer(typeof(NoneErrorSerializationClass));
        NoneErrorSerializationClass tripReportsSerialized = (NoneErrorSerializationClass)_deserializer.ReadObject(dataStream);

        // ...
    }
    else
    {
        MessageBox.Show(errorSerilaized.errorMsg);
    }
}