Obecnie mam kilka problemów. Używam języka C # z Json.NET. Problem w tym, że zawsze dostaję:
{"Napotkano nieoczekiwany znak podczas analizowania wartości: e. Ścieżka '', wiersz 0, pozycja 0"}
Więc sposób, w jaki używam Json.NET, jest następujący. Mam klasę, którą należy ocalić. Klasa wygląda następująco:
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>();
}
}
Jeden obiekt tej klasy zostanie wypełniony i zapisany:
File.WriteAllText(tmpfile, JsonConvert.SerializeObject(current), Encoding.UTF8);
Część do zapisu działa poprawnie, a plik istnieje i jest wypełniony. Następnie plik zostanie wczytany z powrotem do klasy z:
try
{
ViewerStatsFormat current = JsonConvert.DeserializeObject<ViewerStatsFormat>(tmpfile);
//otherstuff
}
catch(Exception ex)
{
//error loging stuff
}
Teraz w linii current = pojawia się wyjątek:
{"Napotkano nieoczekiwany znak podczas analizowania wartości: e. Ścieżka '', wiersz 0, pozycja 0"}
Nie wiem, dlaczego tak się dzieje. Plik json jest następujący -> Kliknij mnie im łącze JSON
Czy ktoś ma jakieś pomysły?
c#
json
visual-studio-2013
json.net
zAfLu
źródło
źródło
Odpowiedzi:
Prawdopodobnie nie przekazujesz JSON do
DeserializeObject
.Wygląda na to, ze
File.WriteAllText(tmpfile,...
tego typutmpfile
Isstring
które zawierają ścieżkę do pliku.JsonConvert.DeserializeObject
przyjmuje wartość JSON, a nie ścieżkę do pliku - więc nie udaje się przekonwertować czegoś podobnego@"c:\temp\fooo"
- co oczywiście nie jest JSON.źródło
Rozwiązałem problem za pomocą tych narzędzi online:
Prosty kod:
źródło
check if the Json structure
jest w porządku w C #?Wystąpił ten sam błąd w moim rozwiązaniu Xamarin.Android.
Sprawdziłem, czy mój kod JSON jest poprawny i zauważyłem, że błąd pojawił się tylko wtedy, gdy uruchomiłem aplikację jako kompilację wydania.
Okazało się, że Linker usuwał bibliotekę z Newtonsoft.JSON, powodując niepoprawne parsowanie JSON.
Naprawiłem błąd, dodając Newtonsoft.Json do ustawienia Ignoruj zestawy w konfiguracji kompilacji systemu Android (zrzut ekranu poniżej)
Kod analizy JSON
Zrzut ekranu programu Visual Studio dla komputerów Mac
Zrzut ekranu programu Visual Studio
źródło
Napotkałem również ten błąd w przypadku akcji internetowego interfejsu API (.Net Core 3.0), która była powiązana z a
string
zamiast tego zobject
lubJObject
. JSON był poprawny, ale spinacz próbował pobrać ciąg ze struktury JSON i nie powiodło się.Więc zamiast:
Musiałem użyć bardziej szczegółowych:
źródło
W moim przypadku plik zawierający ciąg JSON miał BOM . Po usunięciu BOM problem został rozwiązany.
źródło
Ten problem jest związany ze znacznikiem kolejności bajtów w pliku JSON. Plik JSON nie jest kodowany jako dane kodowania UTF8 podczas zapisywania. Korzystanie z
File.ReadAllText(pathFile)
rozwiązania tego problemu.Kiedy operujemy na danych Byte i konwertujemy je na łańcuch, a następnie przekazujemy do JsonConvert.DeserializeObject, możemy użyć kodowania UTF32, aby uzyskać ciąg.
byte[] docBytes = File.ReadAllBytes(filePath);
string jsonString = Encoding.UTF32.GetString(docBytes);
źródło
Miałem ten sam problem z webapi w ASP.NET core, w moim przypadku było tak, ponieważ moja aplikacja wymaga uwierzytelnienia, wtedy przypisuje adnotację
[AllowAnonymous]
i zadziałało.źródło
Załóżmy, że to jest twój plik json
jeśli ponownie chcesz deserializować miejsce, zmodyfikuj json jak poniżej
następnie spróbuj deserializacji do odpowiedniej klasy, przyjmując wartość miejsca
źródło
W moim scenariuszu miałem nieco inny komunikat, w którym linia i pozycja nie były zerowe.
To była najlepsza odpowiedź Google na zacytowaną przeze mnie wiadomość.
Stało się tak, ponieważ wywołałem program z wiersza poleceń systemu Windows, przekazując JSON jako parametr.
Kiedy przejrzałem argumenty w moim programie, wszystkie podwójne cudzysłowy zostały usunięte. Musisz je odtworzyć.
Tutaj zamieściłem rozwiązanie . Chociaż prawdopodobnie można by go ulepszyć za pomocą Regex.
źródło
Miałem podobny błąd i pomyślałem, że odpowiem na wypadek, gdyby ktoś miał coś podobnego. Przeglądałem katalog plików json i deserializowałem je, ale otrzymywałem ten sam błąd.
Problem polegał na tym, że próbował również złapać ukryte pliki. Upewnij się, że przesyłany plik jest plikiem .json. Zgaduję, że poradzi sobie również z tekstem. Mam nadzieję że to pomoże.
źródło
W moim przypadku otrzymywałem błąd w JsonConvert.PopulateObject () . Moja prośba zwróciła kod JSON, który został zawinięty w dodatkową parę nawiasów „[]”, dzięki czemu wynik był tablicą jednego obiektu, a nie tylko obiektu. Oto, co zrobiłem, aby dostać się do tych nawiasów (tylko dla tego typu modelu):
źródło
Jeśli korzystasz z pobierania danych przy użyciu adresu URL ... może być konieczne użycie
źródło
Sprawdź, czy model udostępniany między klientem a serwerem jest taki sam. czasami pojawia się ten błąd, gdy nie zaktualizowałeś wersji Api i zwraca zaktualizowany model, ale nadal masz stary. Czasami otrzymujesz to, co serializujesz / deserializujesz, nie jest prawidłowym plikiem JSON.
źródło
Napotkałem podobny komunikat o błędzie w formularzach Xamarin podczas wysyłania żądania do webApi w celu uzyskania tokena,
źródło
Kiedy napotkał podobny problem, naprawiłem go przez podstawienie
&mode=xml
za&mode=json
we wniosku.źródło