Đã gặp ký tự không mong muốn khi phân tích cú pháp giá trị


113

Hiện tại tôi có một số vấn đề. Tôi đang sử dụng C # với Json.NET. Vấn đề là tôi luôn nhận được:

{"Gặp phải ký tự không mong muốn khi phân tích cú pháp giá trị: e. Đường dẫn '', dòng 0, vị trí 0."}

Vì vậy, cách tôi sử dụng Json.NET như sau. Tôi có một Lớp cần được lưu. Lớp trông như thế này:

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

Một đối tượng của lớp này sẽ được điền và lưu với:

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

Phần lưu hoạt động tốt và tệp tồn tại và được lấp đầy. Sau đó, tệp sẽ được đọc lại vào lớp với:

    try 
{ 

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

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

Bây giờ trên dòng current = có ngoại lệ:

{"Gặp phải ký tự không mong muốn khi phân tích cú pháp giá trị: e. Đường dẫn '', dòng 0, vị trí 0."}

Tôi không biết tại sao điều này đến. Tệp json như sau -> Nhấp vào tôi là liên kết JSON

Có ai có ý tưởng nào?


2
Tôi đã chỉnh sửa tiêu đề của bạn. Vui lòng xem, " Câu hỏi có nên bao gồm" thẻ "trong tiêu đề của họ không? ", Trong đó sự đồng thuận là "không, không nên".
John Saunders

Bạn luôn phải đối mặt với vấn đề này bất kể dữ liệu là gì? Một lần khi tôi gặp sự cố như vậy, nguyên nhân là do dịch vụ đang gửi các ký tự UTF-8 không hợp lệ.
ankhuri

@JohnSaunders xin lỗi vì điều đó. sẽ giữ nó trong của tôi cho các câu hỏi tiếp theo :).
zAfLu

1
@ankhuri chỉ quên để đọc trong các tập tin ... lỗi của tôi
zAfLu

giả sử đó không phải là một vấn đề, những gì khác? recv Exception-> {"topic": "robot1 / Log", "Msg": "Pilot Running"} Gặp phải ký tự không mong muốn khi phân tích cú pháp giá trị: o. Đường dẫn '', dòng 0, vị trí 0.
Tăng đột biến

Câu trả lời:


149

Có thể bạn không chuyển JSON tới DeserializeObject.

Có vẻ như từ File.WriteAllText(tmpfile,...đó loại tmpfilestringcó chứa đường dẫn đến một tập tin. JsonConvert.DeserializeObjectnhận giá trị JSON, không phải đường dẫn tệp - vì vậy nó không thành công khi cố chuyển đổi một cái gì đó như @"c:\temp\fooo"- rõ ràng không phải là JSON.


75

Tôi đã giải quyết vấn đề bằng các công cụ trực tuyến này:

  1. Để kiểm tra xem cấu trúc Json có OK hay không: http://jsonlint.com/
  2. Để tạo lớp Đối tượng của tôi từ cấu trúc Json của tôi: https://www.jsonutils.com/

Mã đơn giản:

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

2
Làm thế nào để check if the Json structure OKAY trong C #?
Kiquenet

1
Có lẽ những người ở đây có thể giúp bạn: stackoverflow.com/questions/14977848/…
Edu Pelais

2
Cảm ơn bạn. json2csharp.com là cứu cánh cho tôi. Sử dụng nó, bạn có thể thiết kế ngược trở lại lớp chính xác trông như thế nào. Cảm ơn một lần nữa!
Aamir

1
Liên kết json2csharp.com không hoạt động nữa. Tôi khuyên bạn nên sử dụng jsonutils.com để thay thế.
Stijn

Tôi đã thay đổi url bị hỏng thành url mới theo đề xuất của bạn @Stijn.
Edu Pelais

14

Tôi gặp phải lỗi tương tự trong giải pháp Xamarin.Android của mình.

Tôi đã xác minh rằng JSON của mình là đúng và nhận thấy rằng lỗi chỉ xuất hiện khi tôi chạy ứng dụng dưới dạng bản phát hành.

Hóa ra là Trình liên kết đang xóa một thư viện khỏi Newtonsoft.JSON, khiến JSON bị phân tích cú pháp không chính xác.

Tôi đã khắc phục lỗi bằng cách thêm Newtonsoft.Json vào cài đặt Bỏ qua hội đồng trong Cấu hình bản dựng Android (ảnh chụp màn hình bên dưới)

Mã phân tích cú pháp 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);
    }
}

Ảnh chụp màn hình Visual Studio Mac

nhập mô tả hình ảnh ở đây

Ảnh chụp màn hình Visual Studio

nhập mô tả hình ảnh ở đây


làm thế nào tôi có thể làm điều đó, trên Visual studio cho ứng dụng nhỏ giọt xamarin.forms?
Mike Darwish

1
@MikeDarwish Tôi đã thêm một ảnh chụp màn hình cho thấy cách thực hiện điều này trong Visual Studio
Brandon Minnick

9

Tôi cũng đã gặp lỗi này đối với hành động Web API (.Net Core 3.0) liên kết với một stringthay thế cho một objecthoặc một JObject. JSON đúng, nhưng chất kết dính đã cố gắng lấy một chuỗi từ cấu trúc JSON và không thành công.

Vì vậy, thay vì:

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

Tôi đã phải sử dụng cụ thể hơn:

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

Điều này đã xảy ra với tôi trên .Net Core 2.0, đăng với Postman
Vitox

Đó là một nhức đầu cho tôi quá, nhưng nó có ý nghĩa vì mỗi json là một cặp khóa-giá trị và bạn nên cung cấp một lớp học với các thuộc tính như là chìa khóa để một cách chính xác bản đồ json tới một thể hiện của lớp đó
Eugene Zakharov

8

Trong trường hợp của tôi, tệp chứa chuỗi JSON có BOM . Sau khi tôi xóa BOM, vấn đề đã được giải quyết.

nhập mô tả hình ảnh ở đây


5

Sự cố này có liên quan đến Dấu thứ tự Byte trong tệp JSON. Tệp JSON không được mã hóa dưới dạng dữ liệu mã hóa UTF8 khi được lưu. Sử dụng File.ReadAllText(pathFile)khắc phục sự cố này.

Khi chúng tôi đang hoạt động trên dữ liệu Byte và chuyển đổi dữ liệu đó thành chuỗi và sau đó chuyển đến JsonConvert.DeserializeObject, chúng tôi có thể sử dụng mã hóa UTF32 để lấy chuỗi.

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

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


3

Tôi đã gặp vấn đề tương tự với webapi trong lõi ASP.NET, trong trường hợp của tôi, đó là do ứng dụng của tôi cần xác thực, sau đó nó chỉ định chú thích [AllowAnonymous]và nó đã hoạt động.

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

Tôi đến bữa tiệc muộn về việc này, nhưng đây cũng là vấn đề của tôi. Khi kiểm tra "json" đi vào phương thức Deserialize của tôi, nó cho thấy nó đang cố gắng xác thực bằng API.
Ben

1

Giả sử đây là json của bạn

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

nếu bạn lại muốn địa điểm deserialize, hãy sửa đổi json như bên dưới

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

sau đó cố gắng deserialize đến lớp tương ứng bằng cách lấy giá trị của địa điểm


1
Xin chào, tôi đang sử dụng JsonConvert.SerializeObject, sẽ tạo ra kết quả đầu tiên cho tôi, làm cách nào để lấy kết quả thứ hai?
user123456 27/09/2016

Điều này không trả lời câu hỏi đã được đặt ra.
Brian Rogers

1

Trong kịch bản của tôi, tôi có một thông báo hơi khác, trong đó dòng và vị trí không phải là số không.

E. Đường dẫn 'job [0] .name', dòng 1, vị trí 12.

Đây là câu trả lời hàng đầu của Google cho thông báo tôi đã trích dẫn.

Điều này xảy ra vì tôi đã gọi một chương trình từ dòng lệnh Windows, chuyển JSON làm tham số.

Khi tôi xem lại các args trong chương trình của mình, tất cả các dấu ngoặc kép đã bị loại bỏ. Bạn phải sửa lại chúng.

Tôi đã đăng một giải pháp ở đây . Mặc dù nó có thể được tăng cường với Regex.


1

Tôi đã gặp một lỗi tương tự và nghĩ rằng tôi sẽ trả lời trong trường hợp có ai đó gặp sự cố tương tự. Tôi đã lặp qua một thư mục các tệp json và giải mã hóa chúng nhưng cũng gặp lỗi này.

Vấn đề là nó cũng đang cố lấy các tệp ẩn. Đảm bảo rằng tệp bạn đang chuyển vào là tệp .json. Tôi đoán nó cũng sẽ xử lý văn bản. Hi vọng điêu nay co ich.


1

Trong trường hợp của tôi, tôi gặp lỗi trên JsonConvert.PopulateObject () . Yêu cầu của tôi là trả về JSON được bao bọc trong một cặp dấu ngoặc '[]' bổ sung, làm cho kết quả của tôi là một mảng của một đối tượng thay vì chỉ một đối tượng. Đây là những gì tôi đã làm để vào bên trong các dấu ngoặc này (chỉ dành cho loại mô hình đó):

           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

Nếu bạn đang sử dụng tải xuống dữ liệu bằng url ... có thể cần sử dụng

var result = client.DownloadData(url);

0

Vui lòng kiểm tra mô hình bạn đã chia sẻ giữa máy khách và máy chủ có giống nhau không. đôi khi bạn gặp lỗi này khi bạn không cập nhật phiên bản Api và nó trả về một mô hình đã cập nhật, nhưng bạn vẫn có một mô hình cũ. Đôi khi bạn nhận được những gì bạn serialize / deserialize không phải là JSON hợp lệ.


-1

Tôi gặp phải thông báo lỗi tương tự trong biểu mẫu Xamarin khi gửi yêu cầu đến webApi để nhận Mã thông báo,

  • Đảm bảo tất cả các khóa ( key : value) (ví dụ: 'tên người dùng', 'mật khẩu', 'loại_cấp_cấp') trong tệp Json chính xác là những gì webApi mong đợi, nếu không nó sẽ kích hoạt ngoại lệ này.

Unhandled Exception: Newtonsoft.Json.JsonReaderException: Gặp phải ký tự không mong muốn khi phân tích cú pháp giá trị: <. Đường dẫn '', dòng 0, vị trí 0


-3

Khi gặp sự cố tương tự, tôi đã khắc phục bằng cách thay thế &mode=xmlcho &mode=jsontrong yêu cầu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.