Сообщение об ошибке JSON при десериализации с помощью JSON Text Reader - PullRequest
0 голосов
/ 28 мая 2020

Я получаю эту ошибку при попытке чтения JSON из потока:

Newtonsoft. Json .JsonSerializationException: 'Неожиданный JSON токен при чтении DataTable. Ожидается StartArray, есть String. Путь '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
}

1 Ответ

2 голосов
/ 28 мая 2020

Проблема в том, что вам не хватает внешнего класса. Вы пытаетесь выполнить десериализацию в 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;

Fiddle: https://dotnetfiddle.net/0uY9Yo

Примечание: вы можете опустить любые свойства из оболочки, которые вы собственно не нужно. Если все, что вам нужно, это SyncResult, тогда обертка может быть такой простой:

public class ResultWrapper
{
    public SyncResult Data { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...