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.

JSON ne pas utiliser key=value, il utilise key:value. Sont ceux qui sont juste des exemples? Désolé, je n'ai pas lu l'ensemble de votre post
Ils 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