2012-01-31 33 views
7

Tôi đã thử nhiều cách để phân tích cú pháp json trong Windows 8 và tôi nhận được lỗi này rất nhiều.Phân tích cú pháp Json Windows8

"WinRT thông tin: WEB_E_INVALID_JSON_STRING"

Nó được đến một điểm mà tôi sử dụng chuỗi json giống nhau, và nó hoạt động (nhiều hơn hoặc ít hơn) nếu tôi đọc từ nó từ trang web, nhưng nó sẽ không hoạt động nếu tôi đọc nó từ một tập tin địa phương.

heres mã để đọc nó từ trang web:

public async void ExamineJson() 
    { 
     string responseText = await GetjsonStream(); 
     ParseJson(responseText); 
    } 


public async Task<string> GetjsonStream() 
    { 
     HttpClient client = new HttpClient(); 
     string url = "http://rmarinho.facilit.us/app/d/rtp/config.json"; 
     HttpResponseMessage response = await client.GetAsync(url); 
     return response.Content.ReadAsString(); 
    } 



    private static void ParseJson(string responseText) 
    { 
     JsonObject root = new JsonObject(responseText); 
     string epg = root.GetNamedString("epgurl"); 

     JsonArray themes = root["themes"].GetArray(); 

     for (int i = 0; i < themes.Count; i++) 
     { 

      JsonObject section = themes[i].GetObject(); 

     } 

    } 

Vì vậy, các công trình này, nhưng nếu tôi sử dụng phương pháp phân tích cú pháp tương tự và sử dụng mã này để có được tập tin từ tập tin địa phương trong ứng dụng của tôi nếu failswith lỗi "Thông tin WinRT: WEB_E_INVALID_JSON_STRING".

FileSync.Read<string>(installedLocation, "config.json", 
      (fileSize, reader) => 
       reader.ReadString(fileSize), 
       responseText => 
       { 
        ParseJson(responseText); 

       }) 

    public static class FileSync 
{ 
    public static async void Read<TDocument>(StorageFolder folder, string fileName, 
     Func<uint, DataReader, TDocument> reader, Action<TDocument> completion = null) 
    { 


     StorageFile file; 
     IRandomAccessStream stream; 
     IInputStream inputStream; 
     DataReader dr; 

     file = await folder.GetFileAsync(fileName); 

     stream = await file.OpenAsync(FileAccessMode.Read); 
     inputStream = stream.GetInputStreamAt(0); 

     uint fileSize = (uint)stream.Size; 

     dr = new DataReader(inputStream); 
     await dr.LoadAsync(fileSize); 

     Task<TDocument> task = new Task<TDocument>(() => reader(fileSize, dr)); 
     task.Start(); 
     TDocument doc = await task; 

     if (completion != null) 
     { 
      completion(doc); 
     } 
    } 

    public static async void Write<TDocument>(StorageFolder folder, string fileName, 
CreationCollisionOption collisionOption, TDocument doc, 
Action<DataWriter, TDocument> writer, Action<bool> complete = null) 
    { 
     StorageFile creator; 
     IRandomAccessStream stream; 
     IOutputStream outputStream; 
     DataWriter dw; 

     creator = await folder.CreateFileAsync(fileName, collisionOption); 

     stream = await creator.OpenAsync(FileAccessMode.ReadWrite); 
     outputStream = stream.GetOutputStreamAt(0); 

     dw = new DataWriter(outputStream); 

     Task task = new Task(() => writer(dw, doc)); 
     task.Start(); 
     await task; 

     await dw.StoreAsync(); 
     bool success = await outputStream.FlushAsync(); 
     if (complete != null) 
     { 
      complete(success); 
     } 
    } 
} 

Bất kỳ ai cũng có thể giúp tôi biết nếu lỗi này từ phiên bản xem trước hoặc thứ gì đó bị thiếu?

Cảm ơn trước

+0

Kiểm tra đơn vị đơn giản không hoạt động? – leppie

+0

Bạn hoàn toàn chắc chắn đó là cùng một chuỗi? Tập tin của bạn sử dụng mã hóa nào? –

+0

có cùng chuỗi .. tôi đã so sánh trực quan và trong mã như chuỗi xFromserver == chuỗi yFromlocal là đúng ... tôi đã tự hỏi nếu nó có một cái gì đó với loại nội dung tập tin khi tôi đọc các tập tin từ một nguồn địa phương .. có vẻ như im không phải là người duy nhất có vấn đề: http://phil-it.org/chris/?p=769 –

Trả lời

1

Đã tìm hiểu điều này. Khi tôi đọc JSON từ một tệp, phương pháp tôi đang sử dụng để đọc tệp đang sao chép ký tự UTF8 ByteOrderMark vào luồng kết quả. Kết quả là, khi tôi gọi stringFromFile.equals (hardcodedString) trả về false. Tôi đã sử dụng đoạn mã sau để đọc văn bản từ một tệp và loại bỏ BOM và bây giờ phân tích cú pháp JSON bằng cách sử dụng Windows.Data.Json hoạt động.

private readonly static string UTF8_BYTE_ORDER_MARK = 
    Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble(), 0, Encoding.UTF8.GetPreamble().Length); 


     private string GetStringContentsOfFile(string path) 
     { 
      Uri filePath = new Uri(path); 
      var jsonFileTask = StorageFile.GetFileFromApplicationUriAsync(filePath).AsTask(); 
      jsonFileTask.Wait(); 
      var jsonFile = jsonFileTask.Result; 

      var getStringContentsTask = FileIO.ReadTextAsync(jsonFile, Windows.Storage.Streams.UnicodeEncoding.Utf8).AsTask(); 
      getStringContentsTask.Wait(); 
      var text = getStringContentsTask.Result; 

      // FileIO.ReadTextAsync copies the UTF8 byte order mark into the result string. Strip the byte order mark 
      text = text.Trim(UTF8_BYTE_ORDER_MARK.ToCharArray()); 

      return text; 

     } 
Các vấn đề liên quan