Değer ayrıştırılırken beklenmeyen karakterle karşılaşıldı


113

Şu anda bazı sorunlarım var. Json.NET ile C # kullanıyorum. Sorun şu ki her zaman şunu elde ediyorum:

{"Değer ayrıştırılırken beklenmeyen karakterle karşılaşıldı: e. Yol '', satır 0, konum 0"}

Yani Json.NET'i kullanma şeklim aşağıdaki gibidir. Kaydedilmesi gereken bir Sınıfım var. Sınıf şuna benzer:

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

Bu sınıfın bir nesnesi aşağıdakilerle doldurulacak ve kaydedilecek:

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

Kaydedilen kısım iyi çalışıyor ve dosya var ve doldurulmuş. Bundan sonra dosya şu şekilde sınıfa geri okunacaktır:

    try 
{ 

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

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

Şimdi geçerli = satırında istisna geliyor:

{"Değer ayrıştırılırken beklenmeyen karakterle karşılaşıldı: e. Yol '', satır 0, konum 0"}

Bunun neden geldiğini bilmiyorum. Json dosyası aşağıdaki gibidir -> JSON bağlantısında bana tıklayın

Herhangi bir fikri olan var mı?


2
Başlığınızı düzenledim. Lütfen " Sorular başlıklarında" etiketler " içermeli mi? " Bölümüne bakın , burada fikir birliği "hayır, olmamalıdır".
John Saunders

Veriler ne olursa olsun her zaman bu sorunla mı karşılaşıyorsunuz? Bir keresinde böyle bir sorunla karşılaştığımda, bunun nedeni hizmetin geçersiz UTF-8 karakterleri göndermesiydi.
ankhuri

@JohnSaunders bunun için üzgünüm. başka sorular için benimkinde tutacak :).
zAfLu

1
@ankhuri dosyaları okumayı unuttum ... benim hatam
zAfLu

bunun bir sorun olmadığını varsayarsak, başka ne olabilir? recv Exception-> {"topic": "robot1 / Log", "Msg": "Pilot Çalışıyor"} Değer ayrıştırılırken beklenmeyen karakterle karşılaşıldı: o. Yol '', satır 0, konum 0.
Çivili3

Yanıtlar:


149

Muhtemelen JSON'a geçmiyorsunuz DeserializeObject.

Bu öyle büyük File.WriteAllText(tmpfile,...bu tür tmpfileDİR stringbir dosyanın yolunu içerir. JsonConvert.DeserializeObjectdosya yolunu değil, JSON değerini alır - bu nedenle @"c:\temp\fooo", JSON olmadığı açık olan - gibi bir şeyi dönüştürmeye çalışırken başarısız olur .


75

Sorunu şu çevrimiçi araçlarla çözdüm:

  1. Json yapısının TAMAM olup olmadığını kontrol etmek için: http://jsonlint.com/
  2. Object sınıfımı Json yapımdan oluşturmak için: https://www.jsonutils.com/

Basit kod:

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

2
check if the Json structureC # 'da OKAY nasıl yapılır ?
Kiquenet

1
Belki buradaki sorular size yardımcı olabilir: stackoverflow.com/questions/14977848/…
Edu Pelais

2
Teşekkür ederim. json2csharp.com benim için hayat kurtarıcı oldu. Bunu kullanarak, doğru sınıfın nasıl görünmesi gerektiğine geri dönebilirsiniz. Tekrar teşekkürler!
Aamir

1
Json2csharp.com bağlantısı artık çalışmıyor. Bunun yerine jsonutils.com'u kullanmanızı öneririm .
Stijn

Bozuk url'yi öneriniz @Stijn olarak yenisiyle değiştirdim.
Edu Pelais

14

Xamarin.Android çözümümde de aynı hatayı yaşadım.

JSON'umun doğru olduğunu doğruladım ve hatanın yalnızca uygulamayı bir Sürüm derlemesi olarak çalıştırdığımda göründüğünü fark ettim.

Bağlayıcının Newtonsoft.JSON'dan bir kitaplığı kaldırdığı ve JSON'un yanlış bir şekilde ayrıştırılmasına neden olduğu ortaya çıktı.

Android Derleme Yapılandırmasındaki Derlemeleri Yoksay ayarına Newtonsoft.Json ekleyerek hatayı düzelttim (aşağıdaki ekran görüntüsü)

JSON Ayrıştırma Kodu

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 Ekran Görüntüsü

görüntü açıklamasını buraya girin

Visual Studio Ekran Görüntüsü

görüntü açıklamasını buraya girin


Bunu nasıl yapabilirim, xamarin.forms için Visual Studio driod uygulaması?
Mike Darwish

1
@MikeDarwish Bunu Visual Studio'da nasıl gerçekleştireceğimi gösteren bir ekran görüntüsü ekledim
Brandon Minnick

9

Ayrıca string, bir objectveya a yerine a'ya bağlanan bir Web API (.Net Core 3.0) eylemi için bu hatayla karşılaştım JObject. JSON doğruydu, ancak bağlayıcı JSON yapısından bir dize almaya çalıştı ve başarısız oldu.

Yani, bunun yerine:

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

Daha spesifik olanı kullanmak zorunda kaldım:

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

Bu, .Net Core 2.0'da bana hile yaptı, Postman
Vitox ile

Benim için de bir baş ağrısıydı, ama mantıklı çünkü her json bir anahtar-değer çifti ve json'u bu sınıfın bir örneğiyle doğru şekilde eşlemek için anahtarlar olarak bir sınıf sağlamalısınız
Eugene Zakharov

8

Benim durumumda, JSON dizesini içeren dosyada BOM vardı . Ürün reçetesini kaldırdıktan sonra sorun çözüldü.

görüntü açıklamasını buraya girin


5

Bu sorun JSON dosyasındaki Bayt Sırası İşareti ile ilgilidir. JSON dosyası, kaydedildiğinde UTF8 kodlama verisi olarak kodlanmaz. File.ReadAllText(pathFile)Bu sorunu düzeltmeyi kullanarak .

Byte verisi üzerinde çalışıp bunu dizeye dönüştürüp ardından JsonConvert.DeserializeObject'e geçirdiğimizde, dizeyi elde etmek için UTF32 kodlamasını kullanabiliriz.

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

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


3

ASP.NET core'da webapi ile aynı problemi yaşadım, benim durumumda uygulamamın kimlik doğrulamasına ihtiyaç duymasıydı, sonra açıklamayı atıyor [AllowAnonymous]ve çalıştı.

[AllowAnonymous]
public async Task <IList <IServic >> GetServices () {
        
}

Partiye bu konuda geç kaldım ama bu benim de sorunumdu. Deserialize yöntemime giren "json" u incelerken, API ile kimlik doğrulamaya çalıştığını gösterdi.
Ben

1

Bunun sizin json'unuz olduğunu varsayalım

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

Mekanı yeniden seri halinden çıkarmak istiyorsanız, json'u aşağıdaki gibi değiştirin

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

daha sonra, mekanın değerini alarak ilgili sınıfa seriyi kaldırmaya çalışın


1
Merhaba, benden ilk sonucu üretecek olan JsonConvert.SerializeObject kullanıyorum, ikincisini nasıl elde ederim?
user123456

Bu, sorulan soruya cevap vermiyor.
Brian Rogers

1

Benim senaryomda, hat ve konumun sıfır olmadığı biraz farklı bir mesajım vardı.

E. Yol 'iş [0] .name', satır 1, konum 12.

Bu, aktardığım mesajın en iyi Google cevabıydı.

Bu, Windows komut satırından bir program çağırdığım ve JSON'u parametre olarak geçirdiğim için ortaya çıktı.

Programımdaki argümanları gözden geçirdiğimde, tüm çift alıntılar kaldırıldı. Onları yeniden yapılandırmalısınız.

Burada bir çözüm yayınladım . Muhtemelen bir Regex ile geliştirilebilir.


1

Benzer bir hata yaşadım ve birinin benzer bir şey yaşaması durumunda cevap vereceğimi düşündüm. Bir json dosyaları dizini üzerinde döngü oluşturuyordum ve bunların serisini kaldırıyordum ama aynı hatayı alıyordum.

Sorun, gizli dosyaları da ele geçirmeye çalışıyor olmasıydı. Verdiğiniz dosyanın bir .json dosyası olduğundan emin olun. Sanırım metin de işleyecek. Bu yardımcı olur umarım.


1

Benim durumumda, JsonConvert.PopulateObject () üzerinde bir hata alıyordum . İsteğim fazladan bir "[]" parantez çiftine sarılmış JSON döndürüyordu, bu da sonucumu bir nesneden ziyade bir nesneden oluşan bir dizi haline getiriyordu . İşte bu parantezlerin içine girmek için yaptım (yalnızca bu tür model için):

           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 kullanarak veri indirmeyi kullanıyorsanız ... kullanmanız gerekebilir

var result = client.DownloadData(url);

0

Lütfen istemci ve sunucu arasında paylaştığınız modelin aynı olup olmadığını kontrol edin. Bazen bu hatayı Api sürümünü güncellemediğinizde alırsınız ve güncellenmiş bir model döndürür, ancak yine de eski bir modele sahipsiniz. Bazen serileştirdiğiniz / seriyi kaldırdığınız şeyin geçerli bir JSON olmadığını görürsünüz.


-1

Token almak için webApi'ye istek gönderirken Xamarin formlarında benzer hata mesajıyla karşılaştım ,

  • Json dosyasındaki tüm anahtarların ( anahtar : değer) (ör. 'Kullanıcı adı', 'şifre', 'grant_type') tam olarak webApi'nin beklediği gibi olduğundan emin olun , aksi takdirde bu istisnayı tetikler.

İşlenmeyen Özel Durum: Newtonsoft.Json.JsonReaderException: Değer ayrıştırılırken beklenmeyen karakterle karşılaşıldı: <. Yol '', satır 0, konum 0


-3

Benzer bir sorun karşılaşılan zaman, ikame edilmesi ile sabit &mode=xmliçin &mode=jsonistekte.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.