Karakter tak terduga ditemukan saat mengurai nilai

113

Saat ini saya mengalami beberapa masalah. Saya menggunakan C # dengan Json.NET. Masalahnya adalah saya selalu mendapatkan:

{"Karakter yang tidak terduga ditemukan saat mengurai nilai: e. Path '', baris 0, posisi 0."}

Jadi cara saya menggunakan Json.NET adalah sebagai berikut. Saya memiliki Kelas yang harus disimpan. Kelasnya terlihat seperti ini:

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

Satu objek dari kelas ini akan diisi dan disimpan dengan:

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

Bagian penyimpanan berfungsi dengan baik dan file tersebut ada dan diisi. Setelah itu file tersebut akan dibaca kembali ke dalam kelas dengan:

    try 
{ 

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

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

Sekarang pada baris = saat ini muncul pengecualian:

{"Karakter yang tidak terduga ditemukan saat mengurai nilai: e. Path '', baris 0, posisi 0."}

Saya tidak tahu mengapa ini datang. File json adalah sebagai berikut -> Click me im the JSON link

Apakah ada yang punya ide?

zAfLu
sumber
2
Saya telah mengedit judul Anda. Silakan lihat, " Haruskah pertanyaan menyertakan" tag "dalam judulnya? ", Di mana konsensusnya adalah "tidak, seharusnya tidak".
John Saunders
Apakah Anda selalu menghadapi masalah ini apa pun datanya? Suatu ketika ketika saya menghadapi masalah seperti itu, alasannya adalah bahwa layanan tersebut mengirimkan karakter UTF-8 yang tidak valid.
ankhuri
@JohnSaunders maaf untuk itu. akan menyimpannya untuk pertanyaan lebih lanjut :).
zAfLu
1
@ankhuri baru saja lupa membaca di file ... salahku
zAfLu
dengan asumsi itu bukan masalah, apa lagi? recv Exception-> {"topic": "robot1 / Log", "Msg": "Pilot Running"} Karakter tak terduga ditemukan saat mengurai nilai: o. Path '', baris 0, posisi 0.
Spiked3

Jawaban:

149

Mungkin Anda tidak meneruskan JSON DeserializeObject.

Sepertinya dari File.WriteAllText(tmpfile,...jenis itu tmpfileadalah stringyang berisi jalur ke file. JsonConvert.DeserializeObjectmengambil nilai JSON, bukan jalur file - jadi gagal mencoba mengonversi sesuatu seperti @"c:\temp\fooo"- yang jelas bukan JSON.

Alexei Levenkov
sumber
75

Saya memecahkan masalah dengan alat online ini:

  1. Untuk memeriksa apakah struktur Json OKE: http://jsonlint.com/
  2. Untuk menghasilkan kelas Object saya dari struktur Json saya: https://www.jsonutils.com/

Kode sederhana:

RootObject rootObj= JsonConvert.DeserializeObject<RootObject>(File.ReadAllText(pathFile));
Edu Pelais
sumber
2
Bagaimana cara check if the Json structure OKE di C #?
Kiquenet
1
Mungkin jawaban di sini dapat membantu Anda: stackoverflow.com/questions/14977848/…
Edu Pelais
2
Terima kasih. json2csharp.com adalah penyelamat bagi saya. Dengan menggunakannya, Anda dapat merekayasa balik kembali ke kelas yang benar seharusnya terlihat. Terima kasih lagi!
Aamir
1
Tautan json2csharp.com tidak berfungsi lagi. Saya merekomendasikan menggunakan jsonutils.com sebagai gantinya.
Stijn
Saya mengubah url rusak ke yang baru sebagai saran Anda @Stijn.
Edu Pelais
14

Saya mengalami kesalahan yang sama dalam solusi Xamarin.Android saya.

Saya memverifikasi bahwa JSON saya benar, dan melihat bahwa kesalahan hanya muncul ketika saya menjalankan aplikasi sebagai Rilis build.

Ternyata Linker menghapus pustaka dari Newtonsoft.JSON, menyebabkan JSON tidak diurai dengan benar.

Saya memperbaiki kesalahan dengan menambahkan Newtonsoft.Json ke pengaturan Ignore assemblies di Android Build Configuration (tangkapan layar di bawah)

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

Tangkapan layar Visual Studio Mac

masukkan deskripsi gambar di sini

Tangkapan Layar Visual Studio

masukkan deskripsi gambar di sini

Brandon Minnick
sumber
bagaimana saya bisa melakukannya, di Visual studio untuk aplikasi driod xamarin.forms?
Mike Darwish
1
@MikeDarwish Saya menambahkan tangkapan layar yang menunjukkan bagaimana melakukannya di Visual Studio
Brandon Minnick
9

Saya juga mengalami kesalahan ini untuk tindakan API Web (.Net Core 3.0) yang mengikat stringalih - alih ke objectatau JObject. JSON benar, tetapi pengikat mencoba mendapatkan string dari struktur JSON dan gagal.

Jadi, alih-alih:

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

Saya harus menggunakan yang lebih spesifik:

[HttpPost("[action]")]
public object Search([FromBody] JObject data)
Alexei
sumber
Ini melakukan trik pada saya di .Net Core 2.0, memposting dengan Postman
Vitox
Itu memusingkan bagi saya juga, tetapi masuk akal karena setiap json adalah pasangan nilai kunci dan Anda harus memberikan kelas dengan properti sebagai kunci untuk memetakan json dengan benar ke instance kelas itu
Eugene Zakharov
8

Dalam kasus saya, file yang berisi string JSON memiliki BOM . Setelah saya menghapus BOM, masalahnya teratasi.

masukkan deskripsi gambar di sini

Aleksei Mialkin
sumber
5

Masalah ini terkait dengan Byte Order Mark di file JSON. File JSON tidak dikodekan sebagai data pengkodean UTF8 saat disimpan. Menggunakan File.ReadAllText(pathFile)memperbaiki masalah ini.

Saat kita mengoperasikan data Byte dan mengubahnya menjadi string dan kemudian meneruskan ke JsonConvert.DeserializeObject, kita dapat menggunakan pengkodean UTF32 untuk mendapatkan string tersebut.

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

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

Praveen
sumber
3

Saya memiliki masalah yang sama dengan webapi di inti ASP.NET, dalam kasus saya itu karena aplikasi saya memerlukan otentikasi, kemudian memberikan anotasi [AllowAnonymous]dan berfungsi.

[AllowAnonymous]
public async Task <IList <IServic >> GetServices () {
        
}
Celso Xavier Luz
sumber
Saya terlambat ke pesta karena hal ini, tetapi ini juga masalah saya. Saat memeriksa "json" yang masuk ke metode Deserialize saya, itu menunjukkan itu mencoba untuk mengotentikasi dengan API.
Ben
1

Misalkan ini json Anda

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

jika Anda ingin deserialize tempat, modifikasi json seperti di bawah ini

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

kemudian coba deserialize ke kelas masing-masing dengan mengambil nilai tempat

Hrishikesh TT
sumber
1
Hai, Saya menggunakan JsonConvert.SerializeObject, yang akan menghasilkan hasil pertama saya, bagaimana cara mendapatkan yang kedua?
pengguna123456
Ini tidak menjawab pertanyaan yang ditanyakan.
Brian Rogers
1

Dalam skenario saya, saya mendapat pesan yang sedikit berbeda, di mana garis dan posisinya bukan nol.

E. Jalur 'pekerjaan [0]. Nama', baris 1, posisi 12.

Ini adalah jawaban Google teratas untuk pesan yang saya kutip.

Ini terjadi karena saya telah memanggil program dari baris perintah Windows, meneruskan JSON sebagai parameter.

Ketika saya meninjau args dalam program saya, semua tanda kutip ganda dihapus. Anda harus menyusunnya kembali.

Saya memposting solusi di sini . Meskipun itu mungkin bisa ditingkatkan dengan Regex.

JGFMK
sumber
1

Saya mengalami kesalahan serupa dan berpikir saya akan menjawabnya jika ada yang mengalami hal serupa. Saya mengulang direktori file json dan deserialisasi mereka tetapi mendapatkan kesalahan yang sama ini.

Masalahnya adalah ia mencoba mengambil file tersembunyi juga. Pastikan file yang Anda berikan adalah file .json. Saya rasa itu akan menangani teks juga. Semoga ini membantu.

Ibaeni
sumber
1

Dalam kasus saya, saya mendapatkan kesalahan pada JsonConvert.PopulateObject () . Permintaan saya mengembalikan JSON yang dibungkus dengan sepasang tanda kurung tambahan '[]', membuat hasil saya berupa larik satu objek, bukan sekadar objek. Inilah yang saya lakukan untuk masuk ke dalam tanda kurung ini (hanya untuk jenis model itu):

           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
sumber
1

Jika Anda menggunakan mengunduh data menggunakan url ... mungkin perlu menggunakan

var result = client.DownloadData(url);
Taran
sumber
0

Harap periksa model yang Anda bagi antara klien dan server sama. terkadang Anda mendapatkan kesalahan ini saat Anda tidak memperbarui versi Api dan mengembalikan model yang diperbarui, tetapi Anda masih memiliki yang lama. Terkadang Anda mendapatkan apa yang Anda serialisasi / deserialisasi bukanlah JSON yang valid.

Nalan Madheswaran
sumber
-1

Saya menghadapi pesan kesalahan serupa dalam bentuk Xamarin saat mengirim permintaan ke webApi untuk mendapatkan Token,

  • Pastikan semua kunci ( key : value) (ex.'username ',' password ',' grant_type ') di file Json persis seperti yang diharapkan webApi, jika tidak, pengecualian ini akan diaktifkan.

Pengecualian Tidak Tertangani: Newtonsoft.Json.JsonReaderException: Karakter tak terduga ditemukan saat mengurai nilai: <. Path '', baris 0, posisi 0

A. Almazidi
sumber
-3

Ketika saya mengalami masalah yang sama, saya tetap dengan menggantikan &mode=xmluntuk &mode=jsondalam permintaan.

AlfredBauer
sumber