Неожиданный символ, возникающий при анализе значения
В настоящее время у меня есть некоторые проблемы. Я использую С# с 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
У кого-нибудь есть какие-либо идеи?
Ответы
Ответ 1
Возможно, вы не передаете JSON в DeserializeObject
.
Это похоже на File.WriteAllText(tmpfile,...
этот тип tmpfile
является string
, содержащей путь к файлу. JsonConvert.DeserializeObject
принимает значение JSON, а не путь к файлу - поэтому он не может преобразовать что-то вроде @"c:\temp\fooo"
- это явно не JSON.
Ответ 2
Я решил проблему с этими онлайн-инструментами:
- Чтобы проверить, в порядке ли структура Json: http://jsonlint.com/
- Чтобы сгенерировать мой класс 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
в запросе.