首页 > 解决方案 > 使用 JSON 文本阅读器反序列化时出现 JSON 错误消息

问题描述

尝试从流中读取 JSON 时出现此错误:

Newtonsoft.Json.JsonSerializationException: '读取 DataTable 时出现意外的 JSON 令牌。预期 StartArray,得到字符串。路径“Data.GUID”,第 1 行,位置 110。

错误在线syncResult = serializer.Deserialize<cls_Sync.SyncResult>(json)

cls_Sync.SyncResult syncResult = new cls_Sync.SyncResult();
using (var stream = await response.Content.ReadAsStreamAsync())
{
    using (var reader = new StreamReader(stream))
    {
        //reader.ReadToEnd();
        using (var json = new JsonTextReader(reader))
        {
            syncResult = serializer.Deserialize<cls_Sync.SyncResult>(json);
        }
    }
}

这是类的结构:

public class SyncResult
{
    public Guid GUID;
    public bool IsSuccessful;
    public string Message;
    public string SQL;
    public DataSet Data;
    public List<Guid> SyncResultGUIDs;
    public Guid LastSyncGUID;

    public SyncResult();
}

示例 JSON:

{
   "ContentEncoding": null,
   "ContentType": "Application/json",
   "Data": {
      "GUID": "00000000-0000-0000-0000-000000000000",
      "IsSuccessful": true,
      "Message": null,
      "SQL": null,
      "Data": {
         "Table": []
      },
      "SyncResultGUIDs": [],
      "LastSyncGUID": "00000000-0000-0000-0000-000000000000"
   },
   "JsonRequestBehavior": 0,
   "MaxJsonLength": null,
   "RecursionLimit": null
}

标签: c#jsonjson.net

解决方案


问题是你缺少一个外部类。您正在尝试反序列化为 a SyncResult,但该对象实际上在 JSON 中更下一层。

尝试定义以下包装类:

public class ResultWrapper
{
    public string ContentEncoding { get; set; }
    public string ContentType { get; set; }
    public SyncResult Data { get; set; }
    public long JsonRequestBehavior { get; set; }
    public int? MaxJsonLength { get; set; }
    public int? RecursionLimit { get; set; }
}

然后反序列化到包装器中并从中获取SyncResult

syncResult = serializer.Deserialize<ResultWrapper>(json).Data;

小提琴:https ://dotnetfiddle.net/0uY9Yo

注意:您可以省略包装器中实际上不需要的任何属性。如果您只需要 ,SyncResult那么包装器可以像这样简单:

public class ResultWrapper
{
    public SyncResult Data { get; set; }
}

推荐阅读