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<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.
【问题讨论】:
【参考方案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 在不忽略子属性的情况下从 documentDB 序列化/反序列化动态/通用对象?