2012-01-31 6 views
7

J'ai essayé plusieurs méthodes pour analyser json dans Windows 8 et j'obtiens beaucoup d'erreurs.Analyse syntaxique JSON Windows8

« informations WinRT: WEB_E_INVALID_JSON_STRING »

Il arrive à un point que j'utilise la même chaîne JSON, et il fonctionne (plus ou moins) si je lis de lui à partir du Web, mais il ne fonctionnera pas si je le lis depuis un fichier local.

Heres le code pour le lire à partir du 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(); 

     } 

    } 

Donc cela fonctionne, mais si j'utilise la même méthode d'analyse syntaxique et utiliser ce code pour obtenir le fichier de fichier local dans mon application si failswith l'erreur "Informations 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); 
     } 
    } 
} 

Tout le monde peut m'aider à comprendre si c'est un bug de la version d'aperçu ou est-ce quelque chose qui me manque ?!

Merci d'avance

+0

Un test unitaire simple ne fonctionne pas? – leppie

+0

Etes-vous absolument sûr que c'est la même chaîne? Quel encodage utilise votre fichier? –

+0

oui est la même chaîne .. j'ai comparé visualy et dans le code comme chaîne xFromserver == chaîne yFromlocal est vrai ... je me demandais si ce pourrait être quelque chose avec le type de fichier contente quand je lis le fichier d'une source locale .. il ne semble pas être le seul avec des problèmes: http://phil-it.org/chris/?p=769 –

Répondre

1

Compris. Lorsque je lis JSON à partir d'un fichier, la méthode que j'utilise pour lire le fichier consiste à copier le caractère UTF8 ByteOrderMark dans le flux de résultats. Par conséquent, lorsque j'appelle stringFromFile.equals (hardcodedString) renvoie false. J'ai utilisé le code suivant pour lire le texte d'un fichier et enlever la nomenclature et maintenant analyser le JSON en utilisant Windows.Data.Json fonctionne.

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; 

     }