Подтвердить что ты не робот

Неожиданный символ, возникающий при анализе значения

В настоящее время у меня есть некоторые проблемы. Я использую С# с Json.NET. Проблема в том, что я всегда получаю:

{"При синтаксическом анализе значения обнаружен неожиданный символ: e. Path '', строка 0, позиция 0."}

Таким образом, я использую Json.NET следующим образом. У меня есть класс, который должен быть сохранен. Класс выглядит так:

public class stats
{
    public string time { get; set; }
    public string value { get; set; }
}

public class ViewerStatsFormat
{
    public List<stats> viewerstats { get; set; }
    public String version { get; set; }

    public ViewerStatsFormat(bool chk)
    {
        this.viewerstats = new List<stats>();
    }
}

Один объект этого класса будет заполнен и сохранен с:

 File.WriteAllText(tmpfile, JsonConvert.SerializeObject(current), Encoding.UTF8);

Сохранение работает нормально, файл существует и заполнен. После этого файл будет считан обратно в класс с помощью:

    try 
{ 

    ViewerStatsFormat current = JsonConvert.DeserializeObject<ViewerStatsFormat>(tmpfile);
    //otherstuff        

}
catch(Exception ex)
{
    //error loging stuff
}

Теперь на текущей = строке появляется исключение:

{"При синтаксическом анализе значения обнаружен неожиданный символ: e. Path '', строка 0, позиция 0."}

Я не знаю, почему это происходит. Файл json выглядит следующим образом → Нажмите меня в ссылке JSON

У кого-нибудь есть какие-либо идеи?

4b9b3361

Ответ 1

Возможно, вы не передаете JSON в DeserializeObject.

Это похоже на File.WriteAllText(tmpfile,... этот тип tmpfile является string, содержащей путь к файлу. JsonConvert.DeserializeObject принимает значение JSON, а не путь к файлу - поэтому он не может преобразовать что-то вроде @"c:\temp\fooo" - это явно не JSON.

Ответ 2

Я решил проблему с этими онлайн-инструментами:

  1. Чтобы проверить, в порядке ли структура Json: http://jsonlint.com/
  2. Чтобы сгенерировать мой класс Object из моей структуры Json: http://json2csharp.com/

Простой код:

RootObject rootObj= JsonConvert.DeserializeObject<RootObject>(File.ReadAllText(pathFile));

Ответ 3

Я испытал ту же ошибку в своем решении Xamarin.Android.

Я подтвердил, что мой JSON был прав, и заметил, что ошибка появилась только при запуске приложения в виде сборки Release.

Оказалось, что компоновщик удаляет библиотеку из Newtonsoft.JSON, в результате чего JSON обрабатывается неправильно.

Я исправил ошибку, добавив Newtonsoft.Json в параметр "Игнорировать сборки" в конфигурации Android Build (снимок экрана ниже)

JSON Parsing Code

static readonly JsonSerializer _serializer = new JsonSerializer();
static readonly HttpClient _client = new HttpClient();

static async Task<T> GetDataObjectFromAPI<T>(string apiUrl)
{
    using (var stream = await _client.GetStreamAsync(apiUrl).ConfigureAwait(false))
    using (var reader = new StreamReader(stream))
    using (var json = new JsonTextReader(reader))
    {
        if (json == null)
            return default(T);

        return _serializer.Deserialize<T>(json);
    }
}

Скриншот Visual Studio Mac

введите описание изображения здесь

Скриншот Visual Studio

введите описание изображения здесь

Ответ 4

Эта проблема связана с меткой порядка байтов в файле JSON. Файл JSON при сохранении не кодируется как данные кодировки UTF8. Использование File.ReadAllText(pathFile) эту проблему.

Когда мы работаем с байтовыми данными и преобразуем их в строку, а затем передаем в JsonConvert.DeserializeObject, мы можем использовать кодировку UTF32 для получения строки.

byte[] docBytes = File.ReadAllBytes(filePath);

string jsonString = Encoding.UTF32.GetString(docBytes);

Ответ 5

Предположим, что это ваш json

{
  "date":"11/05/2016",
  "venue": "{\"ID\":12,\"CITY\":Delhi}"
}

Если вы снова захотите выполнить десериализацию, измените json ниже

{
  "date":"11/05/2016",
  "venue": "{\"ID\":\"12\",\"CITY\":\"Delhi\"}"
}

затем попытайтесь десериализовать соответствующий класс, взяв значение места размещения

Ответ 6

У меня была такая же проблема с webapi в ядре ASP.NET, в моем случае это было потому, что моему приложению нужна аутентификация, затем оно [AllowAnonymous] аннотацию [AllowAnonymous] и это работало.

[AllowAnonymous]
public async Task <IList <IServic >> GetServices () {
        
}

Ответ 7

Если вы используете загрузку данных с помощью url... возможно, вам понадобится

var result = client.DownloadData(url);

Ответ 8

Пожалуйста, проверьте, что модель, которой вы поделились между клиентом и сервером, одинакова. иногда вы получаете эту ошибку, когда вы не обновили версию Api, и она возвращает обновленную модель, но у вас все еще есть старая. Иногда вы получаете то, что сериализуете/десериализуете, не является допустимым JSON.

Ответ 9

В моем сценарии у меня было немного другое сообщение, где линия и позиция не были нулевыми.

E. Путь 'job [0].name', строка 1, позиция 12.

Это был лучший ответ Google для сообщения, которое я цитировал.

Это произошло потому, что я вызвал программу из командной строки Windows, передавая JSON в качестве параметра.

Когда я рассмотрел аргументы в моей программе, все двойные кавычки были удалены. Вы должны восстановить их.

Я разместил решение здесь. Хотя, возможно, это можно улучшить с помощью регулярных выражений.

Ответ 10

У меня была похожая ошибка, и я решил ответить, если у кого-то будет что-то подобное. Я просматривал каталог файлов json и десериализовал их, но получал ту же ошибку.

Проблема заключалась в том, что он также пытался получить скрытые файлы. Убедитесь, что файл, который вы передаете, является файлом .json. Я предполагаю, что это будет обрабатывать текст также. Надеюсь это поможет.

Ответ 11

Я сталкивался с подобным сообщением об ошибке в формах Xamarin при отправке запроса в webApi для получения токена,

  • Убедитесь, что все ключи (key: value) (например, 'username', 'password', 'grant_type') в файле Json в точности соответствуют ожиданиям webApi, в противном случае он вызывает это исключение.

Необработанное исключение: Newtonsoft.Json.JsonReaderException: неожиданный символ, обнаруженный при разборе значения: <. Путь '', строка 0, позиция 0

Ответ 12

Когда я столкнулся с аналогичной проблемой, я исправил ее, заменив &mode=xml на &mode=json в запросе.