2016-06-24 1 views
2

J'utilise un protocole personnalisé pour ouvrir une autre application à partir de l'application Windows Runtime. J'utilise extrait de code suivant:Transmettre une chaîne JSON d'une application vers une autre (Applications Windows 8.1) C#

await Launcher.LaunchUriAsync(new Uri("appb://hello"));

Il fonctionne très bien quand il y a chaîne simple. Mais il donne une erreur d'analyse lors du passage d'une chaîne JSON. Invalid URI: The hostname could not be parsed.

Je crée JSON par:

JObject jObj = new JObject(); 
jObj.Add("Name", "abcdef"); 
jObj.Add("Address", "acvdfs"); 
string json = jObj.ToString(); 

Il donne JSON comme:

{ "Nom": "abcdef", "Adresse": "acvdfs"}

+0

Pourriez-vous s'il vous plaît inclure ce que la valeur JSON 'chaîne' est, lors de l'utilisation de cela? –

+0

Egalement, passez-vous la chaîne * entier * JSON à la méthode? Ou obtenez-vous la valeur requise en premier et * ensuite * en la passant? Si c'est le premier, c'est à cause du fonctionnement de JSON - vous devrez d'abord obtenir la valeur par clé.Voir ici pour la syntaxe JSON: http://www.w3schools.com/json/json_syntax.asp - Si vous pouvez fournir la valeur de votre 'chaîne' JSON, cela aidera aussi :) –

+0

Donc, vous * passez * la toute la chaîne 'json'? –

Répondre

2

Votre problème est que vous envoyez le entierjson chaîne à créer ed comme un Uri.

Vous aurez besoin d'obtenir les valeurs requises de la chaîne première et puis passer ceux à votre méthode.

À titre d'exemple, disons que votre

JObject jObj = new JObject(); 
jObj.Add("Name", "abcdef"); 
jObj.Add("Address", "acvdfs"); 
string json = jObj.ToString(); 
Code

vous donnera un « {Name}/{Address} » sortie - appb://abcdef/acvdfs

au lieu d'analyser que directement à un string, vous devrez obtenir les valeurs des premier.

Sinon, votre

{ "Nom": "abcdef", "Adresse": "acvdfs"}

est ce qui est à l'origine du

URI non valide: Le Le nom d'hôte n'a pas pu être analysé.

erreur.

Vous pouvez le faire afin de récupérer les valeurs de cette chaîne:

var values = jObj.Properties().Select(x => x.Value.ToString()).ToArray(); // Gives you an array of the values. 

var path = string.Join("/", values); // Creates an "a/b" path by joining the array. 

await Launcher.LaunchUriAsync(new Uri("appb://" + path)); // Give that path to create the Uri and pass to your method. 

Ce code suppose que vous ne l'aide des touches pour créer le chemin comme je l'ai. Il fonctionnera pour n'importe quel nombre de clés, car il joint juste toutes les valeurs avec "/" - par exemple. a/b/c/d/e/f/g etc.

Pour toute question, il suffit de demander :)

Hope this helps!

+0

J'ai essayé exactement la même chose. Il donne 'abcdef \ acvdfs' dans le chemin. Mais il renvoie à nouveau la même erreur :( –

+1

Juste pour clarifier, supposons que vous utilisez l'exemple dans la même partie que vous avez déclaré 'jObj'. Si vous récupérez une chaîne JSON" appropriée "d'ailleurs, La classe JsonConvert pour C# est un outil qui peut sauver des vies: http://www.newtonsoft.com/json/help/html/t_newtonsoft_json_jsonconvert.htm –

+1

Ah, mon dieu, ça te donne du mal un caractère "\" au lieu d'un "/" pour votre Uri Supprimer le 'Path.Combine' et faire un' var path = string.Join ("/", valeurs); 'à la place :) –