Réponse SOAP (XML) en JSON
J'ai besoin de consommer un web service SOAP qui, naturellement, envoie sa réponse au format XML, depuis que je suis l'élaboration d'un Appcelerator Titanium mobile app, je préfère la réponse en JSON. Après la recherche en ligne j'ai converti la réponse à l'aide de cette code Javascript, il a surtout travaillé mais les résultats comme suit:
{
"SOAP-ENV:Body" : {
"ns1:linkAppResponse" : {
"ns1:result" : {
#text : true;
};
"ns1:uuid" : {
#text : "a3dd915e-b4e4-43e0-a0e7-3c270e5e7aae";
};
};
};
}
Bien sûr, les colons et les tables de hachage dans l'causé des problèmes donc j'ai modifié le code pour faire une sous-chaîne sur le nom et le déposer quoi que ce soit avant le":", puis un stringified l'résultant JSON, supprimé toutes les hachages et analysé le JSON de nouveau. C'est un peu brouillon à mon goût, mais je me retrouve avec quelque chose d'utilisable.
Ici est la xmlToJson code que j'utilise:
//Changes XML to JSON
function xmlToJson(xml) {
//Create the return object
var obj = {};
if (xml.nodeType == 1) {//element
//do attributes
if (xml.attributes.length > 0) {
obj["@attributes"] = {};
for (var j = 0; j < xml.attributes.length; j++) {
var attribute = xml.attributes.item(j);
obj["@attributes"][attribute.nodeName] = attribute.nodeValue;
}
}
} else if (xml.nodeType == 3) {//text
obj = xml.nodeValue;
}
//do children
if (xml.hasChildNodes()) {
for (var i = 0; i < xml.childNodes.length; i++) {
var item = xml.childNodes.item(i);
var nodeName = item.nodeName.substring(item.nodeName.indexOf(":") + 1);
if ( typeof (obj[nodeName]) == "undefined") {
obj[nodeName] = xmlToJson(item);
} else {
if ( typeof (obj[nodeName].push) == "undefined") {
var old = obj[nodeName];
obj[nodeName] = [];
obj[nodeName].push(old);
}
obj[nodeName].push(xmlToJson(item));
}
}
}
return obj;
};
module.exports = xmlToJson;
Qui résultats dans le JSON suivants:
{
Body : {
linkAppResponse : {
result : {
text : true;
};
uuid : {
text : "9022d249-ea8a-47a3-883c-0f4cfc9d6494";
};
};
};
}
Tout cela retourne un objet JSON que je peux utiliser, je préfère avoir l'résultant de JSON dans la forme suivante:
{
result : true;
uuid : "9022d249-ea8a-47a3-883c-0f4cfc9d6494";
};
Surtout si c'est moins verbeux et je peux simplement appeler json.résultat afin de vérifier si la requête a réussi à la place de json.Corps.linkAppResponse.résultat.texte
Toute aide est grandement appréciée.
key=value
, il utilise key:value
. Sont ceux qui sont juste des exemples? Désolé, je n'ai pas lu l'ensemble de votre postIls sont ce qui est connecté à la console quand je l'appelle de la console.debug() sur l'objet JSON retourné. J'ai remarqué qu'il n'était pas tout à fait juste, mais je pense que c'est un résultat de la fonction tostring, je régler ma question, merci!
OriginalL'auteur JonoCoetzee | 2013-06-26
Vous devez vous connecter pour publier un commentaire.
Est venu avec une solution de travail, pas le moins sale, mais il fonctionne et renvoie les données dans le format que je veux.
de la console.debug(json):
de la console.debug(réponse):
Je vais laisser cette question ouverte pendant un certain temps dans le cas où quelqu'un arrive avec une meilleure solution.
OriginalL'auteur JonoCoetzee