Json.Net不处理空数据表的反序列化

本文关键字:数据表 反序列化 处理 Net Json | 更新日期: 2023-09-27 18:13:04

我有这个类作为对象来序列化:

public class JsonServerToClient
{
    public JsonServerToClient()
    {
        query = new List<Query>();
    }
    public String authKey { get; set; }
    public List<Query> query { get; set; }
    public struct Query
    {
        public int error { get; set; }
        public DataTable result { get; set; }
    }
}

我使用JsonConvert.SerializeObject(objectAbove);来序列化JSON。

JsonConvert.DeserializeObject<JsonServerToClient>(text);反序列化。

当结果充满数据时,所有工作都很好,但如果它是空的,我得到这个JSON:

{
    "authKey": "pippo",
    "query": [
        {
            "error": -1,
            "result": null
        }
    ]
}

问题是当我试图反序列化时,我得到一个异常:

Eccezione non gestita di tipo 'Newtonsoft.Json.JsonSerializationException' in Newtonsoft.Json.dll
Ulteriori informazioni: Unexpected end when deserializing array. Path '', line 1, position 56.

Json.Net不处理空数据表的反序列化

UPDATE

在Json中修复了这个问题。Net版本8.0.1。不再需要下面的解决方法。


似乎DataTableConverter与Json一起发货。Net(从v6.0.3开始)不处理数据表本身为空的情况。您可以通过子类化DataTableConverter并重写ReadJson方法来解决此问题,如下所示:

class CustomDataTableConverter : DataTableConverter
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
        {
            return null;
        }
        return base.ReadJson(reader, objectType, existingValue, serializer);
    }
}

当您反序列化时,一定要指定自定义转换器:

var obj = JsonConvert.DeserializeObject<JsonServerToClient>(json, 
          new CustomDataTableConverter());

哪个版本的Json。你在用。NET吗?根据这篇文章,它似乎是用Json修复的。NET 3.5 r6

我使用Json也有同样的问题。Net从json响应中解析DateTime字段。我尝试了下面的Json Helper类,它正确地处理了datetime字段。public class JsonHelper { /// <summary> /// JSON Serialization /// </summary> public static string JsonSerializer<T>(T t) { DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); MemoryStream ms = new MemoryStream(); ser.WriteObject(ms, t); string jsonString = Encoding.UTF8.GetString(ms.ToArray()); ms.Close(); return jsonString; } /// <summary> /// JSON Deserialization /// </summary> public static T JsonDeserialize<T>(string jsonString) { DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)); T obj = (T)ser.ReadObject(ms); return obj; }