При анализе значения обнаружен неожиданный символ

113

В настоящее время у меня есть проблемы. Я использую C # с 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
}

Теперь в строке current = появляется исключение:

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

Я не знаю, почему это происходит. Файл json следующий -> Щелкните меня по ссылке JSON

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

zAfLu
источник
2
Я отредактировал ваше название. См. Раздел « Должны ли вопросы включать« теги »в свои заголовки? », Где единодушное мнение - «нет, не следует».
Джон Сондерс
Вы всегда сталкиваетесь с этой проблемой, независимо от данных? Однажды, когда я столкнулся с такой проблемой, причина заключалась в том, что служба отправляла недопустимые символы UTF-8.
анхури
@JohnSaunders извините за это. сохраню его для дальнейших вопросов :).
zAfLu
1
@ankhuri просто забыл прочесть в файлах ... моя вина
zAfLu
если это не проблема, что еще? recv Exception-> {"topic": "robot1 / Log", "Msg": "Pilot Running"} При анализе значения обнаружен непредвиденный символ: o. Путь '', строка 0, позиция 0.
Spiked3

Ответы:

149

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

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

Алексей Левенков
источник
76

Я решил проблему с помощью следующих онлайн-инструментов:

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

Простой код:

RootObject rootObj= JsonConvert.DeserializeObject<RootObject>(File.ReadAllText(pathFile));
Эду Пеле
источник
2
Как правильно использовать check if the Json structure C #?
Kiquenet
1
Возможно, ответы здесь могут вам помочь: stackoverflow.com/questions/14977848/…
Edu Pelais
2
Спасибо. json2csharp.com был для меня спасением . Используя его, вы можете реконструировать, как должен выглядеть правильный класс. Еще раз спасибо!
Аамир
1
Ссылка json2csharp.com больше не работает. Вместо этого я рекомендую использовать jsonutils.com .
Stijn
Я изменил сломанный URL-адрес на новый, как ваше предложение @Stijn.
Эду Пелаис
14

У меня возникла такая же ошибка в моем решении Xamarin.Android.

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

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

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

Код разбора JSON

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

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

Брэндон Минник
источник
как я могу это сделать в Visual Studio для приложения дриода xamarin.forms?
Майк Дарвиш
1
@MikeDarwish Я добавил снимок экрана, показывающий, как это сделать в Visual Studio
Брэндон
9

Я также столкнулся с этой ошибкой для действия веб-API (.Net Core 3.0), которое было привязано к a, stringа не к objectили JObject. JSON был правильным, но связыватель попытался получить строку из структуры JSON и потерпел неудачу.

Итак, вместо:

[HttpPost("[action]")]
public object Search([FromBody] string data)

Мне пришлось использовать более конкретный:

[HttpPost("[action]")]
public object Search([FromBody] JObject data)
Алексей
источник
Это
помогло
Для меня это тоже было головной болью, но это имеет смысл, потому что каждый json представляет собой пару ключ-значение, и вы должны предоставить класс со свойствами в качестве ключей для правильного сопоставления json с экземпляром этого класса
Евгений Захаров,
8

В моем случае файл, содержащий строку JSON, имел спецификацию . Как только я удалил спецификацию, проблема была решена.

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

Алексей Мялкин
источник
5

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

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

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

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

Praveen
источник
3

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

[AllowAnonymous]
public async Task <IList <IServic >> GetServices () {
        
}
Сельсо Ксавье Луз
источник
Я опоздал на вечеринку по этому поводу, но это тоже была моя проблема. Изучая "json", входящий в мой метод Deserialize, он показал, что пытается аутентифицироваться с помощью API.
Бен
1

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

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

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

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

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

Хришикеш ТТ
источник
1
Привет, я использую JsonConvert.SerializeObject, который даст мне первый результат, как мне получить второй?
user123456
Это не отвечает на заданный вопрос.
Брайан Роджерс,
1

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

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

Это был главный ответ Google на цитируемое мною сообщение.

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

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

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

JGFMK
источник
1

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

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

Ibaeni
источник
1

В моем случае я получал сообщение об ошибке JsonConvert.PopulateObject () . Мой запрос возвращал JSON, заключенный в дополнительную пару скобок «[]», в результате чего мой результат представлял собой массив из одного объекта, а не просто объект. Вот что я сделал, чтобы попасть в эти скобки (только для этого типа модели):

           T jsonResponse = new T();
                var settings = new JsonSerializerSettings
                {
                    DateParseHandling = DateParseHandling.DateTimeOffset,
                    NullValueHandling = NullValueHandling.Ignore,
                };
                var jRslt = response.Content.ReadAsStringAsync().Result;
                if (jsonResponse.GetType() == typeof(myProject.Models.myModel))
                {
                    var dobj = JsonConvert.DeserializeObject<myModel[]>(jRslt);
                    var y = dobj.First();
                    var szObj = JsonConvert.SerializeObject(y);
                    JsonConvert.PopulateObject(szObj, jsonResponse, settings);
                }
                else
                {
                    JsonConvert.PopulateObject(jRslt, jsonResponse);
                }
pkucas
источник
1

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

var result = client.DownloadData(url);
Таран
источник
0

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

Налан Мадхесваран
источник
-1

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

  • Убедитесь, что все ключи ( ключ : значение) (например, «имя пользователя», «пароль», «тип_предоставления») в файле Json в точности соответствуют ожиданиям webApi, в противном случае это исключение запускается.

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

А. Алмазиди
источник
-3

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

AlfredBauer
источник