मान को पार्स करते समय अप्रत्याशित चरित्र का सामना करना पड़ा


113

वर्तमान में मेरे पास कुछ मुद्दे हैं। मैं Json.NET के साथ C # का उपयोग कर रहा हूं। मुद्दा यह है कि मुझे हमेशा मिलता है:

{"अनपेक्षित चरित्र का सामना करना पड़ा है जबकि मूल्य पार्सिंग: ई। पथ '', लाइन 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
}

अब करंट = लाइन पर अपवाद आता है:

{"अनपेक्षित चरित्र का सामना करना पड़ा है जबकि मूल्य पार्सिंग: ई। पथ '', लाइन 0, स्थिति 0."}

मुझे नहीं पता कि यह क्यों आता है। Json फाइल निम्नलिखित है -> JSON लिंक पर क्लिक करें

क्या किसी के पास कोई विचार है?


2
मैंने आपका शीर्षक संपादित किया है। कृपया देखें, " क्या प्रश्नों को उनके शीर्षकों में" टैग "शामिल होना चाहिए? ", जहां सर्वसम्मति है "नहीं, उन्हें नहीं करना चाहिए"।
जॉन सॉन्डर्स

क्या आपको हमेशा इस मुद्दे का सामना करना पड़ता है कि डेटा क्या है? एक बार जब मुझे इस तरह के मुद्दे का सामना करना पड़ा, तो इसका कारण यह था कि सेवा अमान्य UTF-8 वर्ण भेज रही थी।
अंखुरी

@ जॉनसन को इसके लिए खेद है। इसे आगे के प्रश्नों के लिए खान में रखेंगे :)।
zAfLu

1
@ पंखुरी सिर्फ फाइलों में पढ़ना भूल गई ... मेरी गलती है
zAfLu

यह मानते हुए कि कोई समस्या नहीं है, और क्या है? recv अपवाद-> {"विषय": "robot1 / लॉग", "Msg": "पायलट रनिंग"} अनपेक्षित मान का सामना करते समय सामना करना पड़ा: o। पथ Path ’, पंक्ति ०, स्थिति ०
स्पिकेड ३

जवाबों:


149

संभवतः आप JSON से नहीं गुजर रहे हैं DeserializeObject

यह से की तरह दिखता है File.WriteAllText(tmpfile,...उस प्रकार tmpfileहै stringकि एक फ़ाइल का पथ होना। JsonConvert.DeserializeObjectJSON मान लेता है, फ़ाइल पथ नहीं - इसलिए यह कुछ बदलने की कोशिश में विफल रहता है @"c:\temp\fooo"- जो स्पष्ट रूप से JSON नहीं है।


75

मैंने इन ऑनलाइन टूल के साथ समस्या को हल किया:

  1. यह जाँचने के लिए कि क्या Json संरचना ठीक है: http://jsonlint.com/
  2. मेरे Json संरचना से मेरा ऑब्जेक्ट क्लास उत्पन्न करने के लिए: https://www.jsonutils.com/

सरल कोड:

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

2
check if the Json structureC # में OKAY कैसे है ?
कीकेनेट

1
शायद यहां आने वाले आपकी मदद कर सकते हैं: stackoverflow.com/questions/14977848/…
Edu Pelais

2
धन्यवाद। json2csharp.com मेरे लिए एक जीवन रक्षक था। इसका उपयोग करके आप रिवर्स-इंजीनियर कर सकते हैं कि सही वर्ग को क्या देखना चाहिए। एक बार फिर धन्यवाद!
आमिर

1
लिंक json2csharp.com अब काम नहीं करता है। मैं इसके बजाय jsonutils.com का उपयोग करने की सलाह देता हूं ।
Stijn

मैंने आपके सुझाव @Stijn के रूप में टूटे हुए url को एक नए में बदल दिया।
एडू पेलाइस

14

मैंने अपने Xamarin.Android समाधान में एक ही त्रुटि का अनुभव किया।

मैंने सत्यापित किया कि मेरा JSON सही था, और देखा कि त्रुटि तब दिखाई दी जब मैंने ऐप को रिलीज़ बिल्ड के रूप में चलाया।

यह पता चला कि लिंकर न्यूटनसॉफ्ट.जॉन से एक पुस्तकालय को हटा रहा था, जिससे जेएसएन को गलत तरीके से पार्स किया गया।

मैंने Newtonsoft.Json को एंड्रॉइड बिल्ड कॉन्फिगरेशन में इग्नोर करने वाली असेंबलियों को जोड़कर त्रुटि को ठीक किया (स्क्रीन शॉट नीचे)

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

विजुअल स्टूडियो मैक स्क्रीनशॉट

यहां छवि विवरण दर्ज करें

विजुअल स्टूडियो स्क्रीनशॉट

यहां छवि विवरण दर्ज करें


मैं इसे कैसे कर सकता हूं, xamarin.forms ड्रॉड ऐप के लिए विजुअल स्टूडियो पर?
माइक दारिश

1
@MikeDarwish मैंने विज़ुअल स्टूडियो में इसे पूरा करने का तरीका दिखाते हुए एक स्क्रीनशॉट जोड़ा
ब्रैंडन मिन्निक

9

मुझे वेब API (.Net Core 3.0) एक्शन के लिए भी इस त्रुटि का सामना करना पड़ा stringहै जो एक objectया एक के बजाय एक बाध्यकारी था JObject। JSON सही था, लेकिन बाइंडर ने JSON संरचना से एक स्ट्रिंग प्राप्त करने का प्रयास किया और विफल रहा।

इसलिए, इसके बजाय:

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

मुझे अधिक विशिष्ट उपयोग करना था:

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

इसने मुझ पर .Net कोर 2.0, पोस्टमैन के साथ पोस्टिंग
विटॉक्स

यह मेरे लिए भी एक सिरदर्द था, लेकिन यह समझ में आता है क्योंकि हर जोंस एक महत्वपूर्ण-मूल्य वाला जोड़ा है और आपको उस वर्ग के उदाहरण के लिए जोंस को सही ढंग से मैप करने के लिए गुणों के साथ एक वर्ग प्रदान करना चाहिए
यूजीन ज़खारोव


5

यह समस्या JSON फ़ाइल में बाइट ऑर्डर मार्क से संबंधित है। जब सहेजा जाता है तो JSON फ़ाइल UTF8 एन्कोडिंग डेटा के रूप में एन्कोडेड नहीं होती है। File.ReadAllText(pathFile)इस समस्या को ठीक करना ।

जब हम बाइट डेटा पर काम कर रहे हैं और इसे स्ट्रिंग में परिवर्तित कर रहे हैं और फिर JsonConvert.DeserializeObject में जा रहे हैं, तो हम स्ट्रिंग प्राप्त करने के लिए UTF32 एन्कोडिंग का उपयोग कर सकते हैं।

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

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


3

मुझे ASP.NET कोर में वेबैपी के साथ एक ही समस्या थी, मेरे मामले में ऐसा इसलिए था क्योंकि मेरे आवेदन को प्रमाणीकरण की आवश्यकता है, फिर यह एनोटेशन असाइन करता है [AllowAnonymous]और यह काम करता है।

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

मुझे इस पर पार्टी के लिए देर हो रही है, लेकिन यह मेरा मुद्दा भी था। "Dessonialize मेथड" में जा रहे "json" की जाँच करते समय, यह दिखा कि यह API के साथ प्रमाणित करने की कोशिश कर रहा था।
बेन

1

मान लीजिए यह आपका जसन है

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

यदि आप फिर से deserialize स्थल चाहते हैं, तो नीचे दिए गए विवरण को संशोधित करें

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

फिर स्थल का मूल्य लेकर संबंधित वर्ग के लिए deserialize करने का प्रयास करें


1
नमस्ते, मैं JsonConvert.SerializeObject का उपयोग कर रहा हूं, जो पहले परिणाम का निर्माण करेगा, मुझे दूसरा कैसे मिलेगा?
user123456

यह उस प्रश्न का उत्तर नहीं देता है जो पूछा गया था।
ब्रायन रोजर्स

1

मेरे परिदृश्य में मेरे पास एक अलग संदेश था, जहां रेखा और स्थिति शून्य नहीं थी।

ई। पथ 'नौकरी [0] .name', पंक्ति 1, स्थिति 12।

मेरे द्वारा उद्धृत संदेश के लिए यह शीर्ष Google उत्तर था।

यह इस बारे में आया क्योंकि मैंने JSON को एक पैरामीटर के रूप में पारित करते हुए विंडोज कमांड लाइन से एक कार्यक्रम बुलाया था।

जब मैंने अपने कार्यक्रम में आर्ग की समीक्षा की, तो सभी दोहरे उद्धरण छीन लिए गए। आपको उन्हें पुनर्गठित करना होगा।

मैंने यहां एक समाधान पोस्ट किया । हालांकि इसे शायद रेक्स के साथ बढ़ाया जा सकता है।


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

एक टोकन प्राप्त करने के लिए webApi को अनुरोध भेजने पर मुझे Xamarin रूपों में इसी तरह के त्रुटि संदेश का सामना करना पड़ा ,

  • सुनिश्चित करें कि Json फ़ाइल में सभी कुंजियाँ ( कुंजी : मान) (उदा। नाम, 'पासवर्ड', 'अनुदान_प्रकार') ठीक वैसी ही हैं जैसी कि वेबएपी अपेक्षा करता है, अन्यथा यह इस अपवाद को मिटा देता है।

अखंडित अपवाद: Newtonsoft.Json.JsonReaderException: मान को पार्स करते समय अनपेक्षित वर्ण का सामना करना पड़ा: <। पथ '', पंक्ति 0, स्थिति 0


-3

जब मैं एक ऐसी ही समस्या का सामना करना, मैं इसे प्रतिस्थापन द्वारा तय &mode=xmlके लिए &mode=jsonअनुरोध में।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.