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?


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.


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

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


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)

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


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


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

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


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.


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.


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

1

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

var result = client.DownloadData(url);

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.


-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


-3

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.