【问题标题】:Json.Net does not handle deserializing a null DataTableJson.Net 不处理反序列化 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.

【问题讨论】:

    标签: c# json serialization json.net jsonserializer


    【解决方案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; }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-09
        • 1970-01-01
        相关资源
        最近更新 更多