Несподіваний символ, що виникає під час розбору значення


113

В даний час у мене є деякі проблеми. Я використовую C # з Json.NET. Проблема в тому, що я завжди отримую:

{"Несподіваний символ, що виникає під час розбору значення: е. Шлях", рядок 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 = рядок виходить виняток:

{"Несподіваний символ, що виникає під час розбору значення: е. Шлях", рядок 0, позиція 0. "}

Я не знаю, чому це відбувається. Файл json такий -> Клацніть на мене посилання JSON

Хтось має ідеї?


2
Я відредагував вашу назву. Будь ласка, дивіться: " Чи повинні питання включати" теги "в їх заголовки? ", Де консенсус "ні, вони не повинні".
Джон Сондерс

Ви завжди стикаєтеся з цим питанням незалежно від даних? Одного разу, коли я стикався з такою проблемою, причиною стало те, що служба надсилала недійсні символи UTF-8.
ankhuri

@JohnSaunders вибачте за це. збереже його в моїх для подальших питань :).
zAfLu

1
@ankhuri просто забув прочитати у файлах ... моя провина
zAfLu

припускаючи, що це не проблема, що ще? recv Виняток-> {"topic": "robot1 / Log", "Msg": "Пілот працює"} Неочікуваний символ, що виникає під час розбору значення: o. Шлях '', рядок 0, позиція 0.
Spiked3

Відповіді:


149

Можливо, ви не передаєте JSON DeserializeObject.

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


75

Я вирішив проблему з цими онлайн-інструментами:

  1. Щоб перевірити, чи є структура Json OKAY: http://jsonlint.com/
  2. Щоб створити мій клас об’єктів зі своєї структури Json: https://www.jsonutils.com/

Простий код:

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

2
Як зробити check if the Json structure OKAY в C #?
Кікенет

1
Можливо, aswers тут може допомогти вам: stackoverflow.com/questions/14977848 / ...
Edu Pelais

2
Дякую. json2csharp.com був рятівником для мене. Використовуючи його, ви можете повернути інженеру до того, як повинен виглядати правильний клас. Знову дякую!
Аамір

1
Посилання json2csharp.com більше не працює. Я рекомендую замість цього використовувати jsonutils.com .
Стийн

Я змінив порушений URL на новий як ваше пропозиція @Stijn.
Еду Пеле

14

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

Я переконався, що мій JSON правильний, і помітив, що помилка з’явилася лише тоді, коли я запускав додаток у вигляді збірки випуску.

Виявилося, що Linker видаляв бібліотеку з 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 для додатків driod xamarin.forms?
Майк Дарвіш

1
@MikeDarwish Я додав скріншот, який показує, як це досягти у Visual Studio
Брендон Міннік

9

Я також зіткнувся з цією помилкою під час дії Web API (.Net Core 3.0), яка була прив'язкою до stringа objectчи a JObject. JSON був правильним, але біндер намагався отримати рядок зі структури JSON і не вдався.

Отже, замість:

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

Мені довелося скористатися більш конкретним:

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

Це зробило мені трюк у .Net Core 2.0, розміщуючи повідомлення з Postman
Vitox

Це теж було для мене головним болем, але це має сенс, тому що кожен json - пара ключових значень, і ви повинні надати клас із властивостями як ключі, щоб правильно відобразити json на екземпляр цього класу
Євген Захаров


5

Це питання пов’язане з позначкою порядку байтів у файлі JSON. Файл JSON не кодується як дані кодування UTF8 при збереженні. Використовуючи File.ReadAllText(pathFile)виправити цю проблему.

Коли ми працюємо над байтовими даними та перетворюємо їх у рядок, а потім переходимо до JsonConvert.DeserializeObject, ми можемо використовувати кодування UTF32, щоб отримати рядок.

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

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


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, який дасть мені перший результат, як мені отримати другий?
користувач123456

Це не відповідає на запитання, яке було задано.
Брайан Роджерс

1

У моєму сценарії у мене було дещо інше повідомлення, де лінія та положення були не нульовими.

E. Шлях 'робота [0]. Ім'я', рядок 1, позиція 12.

Це була найкраща відповідь Google на повідомлення, яке я цитував.

Це сталося тому, що я викликав програму з командного рядка Windows, передаючи JSON як параметр.

Коли я переглянув аргументи у своїй програмі, всі подвійні цитати вилучили. Ви повинні їх відновити.

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


1

У мене була подібна помилка, і я думав, що відповім у випадку, якщо у когось є щось подібне. Я перебирав каталог файлів json і десяриалізував їх, але отримував цю саму помилку.

Проблема полягала в тому, що він також намагався захопити приховані файли. Переконайтеся, що файл, який ви передаєте, - це .json-файл. Я здогадуюсь, він також буде обробляти текст. Сподіваюся, це допомагає.


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);
                }

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в запиті.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.