Json.Net 不处理反序列化 null DataTable

Posted

技术标签:

【中文标题】Json.Net 不处理反序列化 null DataTable【英文标题】:Json.Net does not handle deserializing a null DataTable 【发布时间】:2014-09-05 11:08:21 【问题描述】:

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

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&lt;JsonServerToClient&gt;(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.

【问题讨论】:

【参考方案1】:

更新

此问题已在 Json.Net 版本 8.0.1 中修复。不再需要以下解决方法。


Json.Net(从 v6.0.3 开始)附带的 DataTableConverter 似乎无法处理数据表本身为空的情况。您可以通过继承 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());

【讨论】:

【参考方案2】:

您使用的是哪个版本的 Json.NET?根据这个post,它似乎是用 Json.NET 3.5r6 修复的

【讨论】:

运行时版本 v4.0.30319【参考方案3】:

我在使用 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;

【讨论】:

以上是关于Json.Net 不处理反序列化 null DataTable的主要内容,如果未能解决你的问题,请参考以下文章

json.net中属性的自定义反序列化[重复]

如何让 Json.Net 在不忽略子属性的情况下从 documentDB 序列化/反序列化动态/通用对象?

使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON.net 的json的序列化与反序列化

Json.net反序列化不反序列化所有属性

使属性反序列化但不使用 json.net 序列化

C#JSON.NET - 反序列化使用不寻常数据结构的响应