พบอักขระที่ไม่คาดคิดขณะแยกวิเคราะห์ค่า


113

ขณะนี้ฉันมีปัญหาบางอย่าง ฉันใช้ C # กับ Json.NET ปัญหาคือฉันมักจะได้รับ:

{"พบอักขระที่ไม่คาดคิดขณะแยกวิเคราะห์ค่า: e. path '' บรรทัด 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
}

ตอนนี้ในปัจจุบัน = บรรทัดมีข้อยกเว้น:

{"พบอักขระที่ไม่คาดคิดขณะแยกวิเคราะห์ค่า: e. path '' บรรทัด 0 ตำแหน่ง 0"}

ฉันไม่รู้ว่าทำไมถึงมา ไฟล์ json มีดังต่อไปนี้ -> คลิกฉันที่ลิงก์ JSON

ใครมีความคิดบ้างไหม?


2
ฉันแก้ไขชื่อของคุณแล้ว โปรดดู " คำถามควรมี" แท็ก "ในชื่อเรื่องหรือไม่ " โดยที่ฉันทามติคือ "ไม่ควรไม่ควร"
John Saunders

คุณประสบปัญหานี้เสมอไม่ว่าข้อมูลจะเป็นอย่างไร? ครั้งหนึ่งเมื่อฉันประสบปัญหาดังกล่าวสาเหตุก็คือบริการส่งอักขระ UTF-8 ที่ไม่ถูกต้อง
ankhuri

@JohnSaunders ขอโทษที่. จะเก็บไว้เป็นของฉันสำหรับคำถามเพิ่มเติม :)
zAfLu

1
@ankhuri ลืมอ่านในไฟล์ ... ความผิดของฉัน
zAfLu

สมมติว่าไม่ใช่ปัญหามีอะไรอีก? recv Exception-> {"topic": "robot1 / Log", "Msg": "Pilot Running"} พบอักขระที่ไม่คาดคิดขณะแยกวิเคราะห์ค่า: o เส้นทาง '' บรรทัด 0 ตำแหน่ง 0
Spiked3

คำตอบ:


149

อาจเป็นไปได้ที่คุณจะไม่ผ่าน JSON DeserializeObjectเพื่อ

ดูเหมือนว่าจากFile.WriteAllText(tmpfile,...ประเภทtmpfileนั้นจะstringมีเส้นทางไปยังไฟล์ JsonConvert.DeserializeObjectใช้ค่า JSON ไม่ใช่เส้นทางไฟล์ - ดังนั้นจึงล้มเหลวในการพยายามแปลงสิ่งที่ต้องการ@"c:\temp\fooo"ซึ่งไม่ใช่ JSON อย่างชัดเจน


76

ฉันแก้ไขปัญหาด้วยเครื่องมือออนไลน์เหล่านี้:

  1. เพื่อตรวจสอบว่าโครงสร้าง Json ใช้ได้หรือไม่: http://jsonlint.com/
  2. ในการสร้างคลาส Object ของฉันจากโครงสร้าง Json ของฉัน: https://www.jsonutils.com/

รหัสง่ายๆ:

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

2
วิธีการ check if the Json structureถูกต้องใน C #?
Kiquenet

1
บางทีความกลัวที่นี่อาจช่วยคุณได้: stackoverflow.com/questions/14977848/…
Edu Pelais

2
ขอบคุณ. json2csharp.comเป็นตัวช่วยชีวิตสำหรับฉัน เมื่อใช้มันคุณสามารถทำวิศวกรรมย้อนกลับกลับไปว่าคลาสที่ถูกต้องควรมีลักษณะอย่างไร ขอบคุณอีกครั้ง!
Aamir

1
ลิงก์ json2csharp.com ไม่ทำงานอีกต่อไป ขอแนะนำให้ใช้jsonutils.comแทน
Stijn

ฉันเปลี่ยน url ที่เสียเป็น url ใหม่ตามคำแนะนำของคุณ @Stijn
Edu Pelais

14

ฉันพบข้อผิดพลาดเดียวกันในโซลูชัน Xamarin.Android ของฉัน

ฉันตรวจสอบแล้วว่า JSON ของฉันถูกต้องและสังเกตว่าข้อผิดพลาดจะปรากฏขึ้นเมื่อฉันเรียกใช้แอปเป็นรุ่นที่วางจำหน่ายเท่านั้น

ปรากฎว่า Linker กำลังลบไลบรารีออกจาก Newtonsoft.JSON ทำให้แยกวิเคราะห์ JSON ไม่ถูกต้อง

ฉันแก้ไขข้อผิดพลาดโดยเพิ่ม Newtonsoft.Json ในการตั้งค่าแอสเซมบลีที่ละเว้นในการกำหนดค่า Android Build (ภาพหน้าจอด้านล่าง)

รหัสการแยกวิเคราะห์ 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);
    }
}

ภาพหน้าจอ Visual Studio Mac

ใส่คำอธิบายภาพที่นี่

ภาพหน้าจอของ Visual Studio

ใส่คำอธิบายภาพที่นี่


ฉันจะทำได้อย่างไรบน Visual studio สำหรับแอป xamarin.forms driod
Mike Darwish

1
@MikeDarwish ฉันได้เพิ่มภาพหน้าจอที่แสดงวิธีการทำสิ่งนี้ใน Visual Studio
Brandon Minnick

9

ฉันยังพบข้อผิดพลาดนี้สำหรับการดำเนินการ Web API (.Net Core 3.0) ที่ผูกกับ a stringแทนobjectหรือJObject. JSON ถูกต้อง แต่ตัวประสานพยายามดึงสตริงจากโครงสร้าง JSON และล้มเหลว

ดังนั้นแทนที่จะ:

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

ฉันต้องใช้สิ่งที่เฉพาะเจาะจงมากขึ้น:

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

นี่เป็นเคล็ดลับสำหรับฉันบน. Net Core 2.0 โดยโพสต์ด้วย Postman
Vitox

ฉันปวดหัวเหมือนกัน แต่มันก็สมเหตุสมผลเพราะ json ทุกคู่เป็นคู่คีย์ - ค่าและคุณควรให้คลาสที่มีคุณสมบัติเป็นกุญแจในการแมป json กับอินสแตนซ์ของคลาสนั้นอย่างถูกต้อง
Eugene Zakharov

8

ในกรณีของไฟล์ที่มีสตริง JSON มีBOM เมื่อฉันลบ BOM ปัญหาได้รับการแก้ไขแล้ว

ใส่คำอธิบายภาพที่นี่


5

ปัญหานี้เกี่ยวข้องกับ Byte Order Mark ในไฟล์ JSON ไฟล์ JSON ไม่ได้เข้ารหัสเป็นข้อมูลการเข้ารหัส UTF8 เมื่อบันทึก ใช้File.ReadAllText(pathFile)แก้ไขปัญหานี้

เมื่อเราดำเนินการกับข้อมูล Byte และแปลงเป็นสตริงแล้วส่งไปยัง JsonConvert DeserializeObject เราสามารถใช้การเข้ารหัส UTF32 เพื่อรับสตริง

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

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


3

ฉันมีปัญหาเดียวกันกับ webapi ใน ASP.NET core ในกรณีของฉันเป็นเพราะแอปพลิเคชันของฉันต้องการการรับรองความถูกต้องดังนั้นจึงกำหนดคำอธิบายประกอบ[AllowAnonymous]และใช้งานได้

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

ฉันสายไปงานปาร์ตี้เรื่องนี้ แต่นี่ก็เป็นปัญหาของฉันเช่นกัน เมื่อตรวจสอบ "json" ที่เข้าสู่เมธอด Deserialize ของฉันพบว่ากำลังพยายามตรวจสอบสิทธิ์ด้วย API
เบ็น

1

สมมติว่านี่คือ json ของคุณ

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

หากคุณต้องการยกเลิกการกำหนดค่าสถานที่อีกครั้งให้แก้ไข json ดังต่อไปนี้

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

จากนั้นพยายามที่จะแยกออกจากชั้นเรียนตามลำดับโดยคำนึงถึงคุณค่าของสถานที่จัดงาน


1
สวัสดีฉันใช้ JsonConvert.SerializeObject ซึ่งจะให้ผลลัพธ์แรกจากฉันฉันจะได้ผลลัพธ์ที่สองได้อย่างไร
user123456

สิ่งนี้ไม่ตอบโจทย์ที่ถูกถาม
Brian Rogers

1

ในสถานการณ์ของฉันฉันมีข้อความที่แตกต่างกันเล็กน้อยโดยที่บรรทัดและตำแหน่งไม่ใช่ศูนย์

E. Path 'job [0] .name' บรรทัดที่ 1 ตำแหน่ง 12.

นี่คือคำตอบยอดนิยมของ Google สำหรับข้อความที่ฉันยกมา

สิ่งนี้เกิดขึ้นเพราะฉันเรียกโปรแกรมจากบรรทัดคำสั่งของ Windows โดยส่ง JSON เป็นพารามิเตอร์

เมื่อฉันตรวจสอบ args ในโปรแกรมของฉันเครื่องหมายคำพูดคู่ทั้งหมดจะถูกตัดออก คุณต้องสร้างใหม่

ผมโพสต์วิธีการแก้ปัญหาที่นี่ แม้ว่ามันจะสามารถปรับปรุงได้ด้วย Regex


1

ฉันมีข้อผิดพลาดที่คล้ายกันและคิดว่าฉันจะตอบได้ในกรณีที่มีใครพบสิ่งที่คล้ายกัน ฉันวนลูปผ่านไดเร็กทอรีของไฟล์ json และ deserializing แต่ก็ได้รับข้อผิดพลาดเดียวกันนี้

ปัญหาคือมันพยายามดึงไฟล์ที่ซ่อนอยู่เช่นกัน ตรวจสอบว่าไฟล์ที่คุณส่งผ่านเป็นไฟล์. 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);
                }


0

โปรดตรวจสอบรุ่นที่คุณแชร์ระหว่างไคลเอนต์และเซิร์ฟเวอร์เหมือนกัน บางครั้งคุณได้รับข้อผิดพลาดนี้เมื่อคุณไม่ได้อัปเดตเวอร์ชัน Api และส่งคืนโมเดลที่อัปเดต แต่คุณยังมีเวอร์ชันเก่าอยู่ บางครั้งคุณได้รับสิ่งที่คุณทำให้เป็นอนุกรม / deserialize ไม่ใช่ JSON ที่ถูกต้อง


-1

ฉันพบข้อความแสดงข้อผิดพลาดที่คล้ายกันในแบบฟอร์ม Xamarinเมื่อส่งคำขอไปที่ webApi เพื่อรับโทเค็น

  • ตรวจสอบให้แน่ใจว่าคีย์ทั้งหมด ( คีย์ : ค่า) (เช่น 'ชื่อผู้ใช้', 'รหัสผ่าน', 'Grant_type') ในไฟล์ Json เป็นสิ่งที่ webApi คาดหวังมิฉะนั้นจะทำให้เกิดข้อยกเว้นนี้

Unhandled Exception: Newtonsoft.Json.JsonReaderException: พบอักขระที่ไม่คาดคิดขณะแยกวิเคราะห์ค่า: <. เส้นทาง '' บรรทัด 0 ตำแหน่ง 0


-3

เมื่อผมพบปัญหาที่คล้ายกันผมคงได้โดยการแทน&mode=xmlสำหรับ&mode=jsonในคำขอ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.