Unity: Erreur lors de l’parsing JSON à partir d’une source distante

Dans Unity 5.4, j’ai un fichier JSON que je peux parsingr avec succès via JsonUtility.FromJson lorsque je le récupère localement à partir de StreamingAssets. à partir d’un serveur distant.

Je peux sortir les fichiers local et distant ( jsonSsortingng ) juste avant l’parsing par JsonUtility , et ils sont identiques (j’ai même validé chacun dans un validateur JSON).

Voici le code que j’utilise pour extraire et parsingr le JSON distant:

void Prime(){ ssortingng url = "https:content_url.json"; WWW www = new WWW(url); StartCoroutine(WaitForContentJSON(www)); } IEnumerator WaitForContentJSON(WWW contentData) { yield return contentData; // check for errors if (contentData.error == null) { ParseJSON(contentData.text); } else { Debug.Log("WWW Error: "+ contentData.error); } } void ParseJSON(ssortingng jsonSsortingng){ var ac = JsonUtility.FromJson(jsonSsortingng); } 

L’erreur est renvoyée dans ParseJSON lors de l’appel de JsonUtility.FromJson

Toute aide très appréciée.

EDIT: Ajout de la demande JSON per @ Programmer

JSON renvoyé d’un fichier local via File.ReadAllText :

 { "articles": [ { "articleID": "1", "title": "Life & Death at the Mexican Border", "byline": "Part 1 of Life and Death...", "longDescription": "Part 1 of Life and Death...", "imageURL": "http://soffr.miximages.com/c%23/foo.jpg", "videoURL": "http://foot.mp4", "sceneAssetBundle": "scene_bundle_1", "sceneName": "scene_1", "featured": true, "duration": "7:12", "videoSize": "625" }, { "articleID": "2", "title": "Lake Mead", "byline": "The shrinking water....", "longDescription": "Welcome...", "imageURL": "http://soffr.miximages.com/c%23/vfoo.jpg", "videoURL": "http://food.mp4", "sceneAssetBundle": "scene_bundle_2", "sceneName": "scene_2", "featured": true, "duration": "1:45", "videoSize": "151" }, { "articleID": "3", "title": "Visi...", "byline": "Experience...", "longDescription": "Experience...", "imageURL": "http://soffr.miximages.com/c%23/foo.jpg", "videoURL": "http://foo.mp4", "sceneAssetBundle": "scene_bundle_2", "sceneName": "scene_2", "featured": false, "duration": "5:46", "videoSize": "478" } ] } 

JSON est revenu de la télécommande (S3):

 { "articles": [ { "articleID": "1", "title": "Life & Death at...", "byline": "Part 1 of...", "imageURL": "http:foo.jpg", "videoURL": "http://foo.mp4", "featured": true, "duration": "7:12", "videoSize": "625" }, { "articleID": "2", "title": "Lake Mead", "byline": "The...", "longDescription": "Welcome...", "imageURL": "http://soffr.miximages.com/c%23/foo.jpg", "videoURL": "http://foo.mp4", "featured": true, "duration": "1:45", "videoSize": "151" }, { "articleID": "3", "title": "Visit", "byline": "Experience...", "longDescription": "Experience the...", "imageURL": "http:foo.jpg", "videoURL": "http://foo.mp4", "featured": false, "duration": "5:46", "videoSize": "478" } ] } 

Encore une fois, j’ai validé ces deux fichiers JSON dans un validateur, et encore une fois, l’appel JsonUtility.FromJson fonctionne correctement lorsqu’il est transmis localement au fichier JSON, mais des erreurs se sont produites lors de la transmission du fichier JSON de la source distante via WWW.

Et, par requête de @dbc, je poste le corps de mes classes de wrapper ArticlesCollection et Articles dans / contre (?) Auquel le JSON est analysé. Mais encore une fois, cela fonctionne bien lorsque vous extrayez le JSON localement. Par conséquent, je ne soupçonne aucun problème dans ces fichiers.

ArticlesCollection :

 using UnityEngine; [System.Serializable] public class ArticlesCollection { public Article[] articles; } 

Les articles :

 using UnityEngine; [System.Serializable] public class Article { public ssortingng title; public int articleID; public ssortingng byline; public ssortingng longDescription; public ssortingng imageURL; public ssortingng experienceURL; public bool featured; public ssortingng duration; public ssortingng experienceSize; public ssortingng sceneAssetBundle; public ssortingng sceneName; } 

Puisque vous utilisez Unity 5.4 , vous ne devriez pas utiliser WWW pour les requêtes Web. UnityWebRequest remplacé WWW et résout ce problème de 3 octets supplémentaires. Il y a juste beaucoup d’autres raisons de l’utiliser, telles que le support de https.

 IEnumerator WaitForRequest(ssortingng url) { UnityWebRequest www = UnityWebRequest.Get(url); yield return www.Send(); if (www.isError) { Debug.Log("Error: " + www.error); } else { Debug.Log("Downloaded: " + www.downloadHandler.text); // byte[] results = www.downloadHandler.data; ArticlesCollection article = JsonUtility.FromJson(www.downloadHandler.text); } } 

La réponse a donc été celle indiquée dans cet article, http://answers.unity3d.com/questions/844423/wwwtext-not-reading-utf-8-text.html

Ceci est un correctif vérifié pour mon problème.

Le problème semble être qu’il y a exactement 3 octets supplémentaires en tête de la réponse. Le correctif consiste à utiliser http://WWW.bytes au lieu de http://WWW.text , puis découpez les 3 octets supplémentaires. Ainsi,

 ssortingng jsonSsortingng; jsonSsortingng = System.Text.Encoding.UTF8.GetSsortingng(contentData.bytes, 3, contentData.bytes.Length - 3); 

C’est particulièrement étrange étant donné TOUTE la documentation que j’ai pu trouver indiquée à l’aide de http://WWW.text . On dirait que Unity devrait append à WWW une propriété de données qui résoudrait ce problème.