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.
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;
}