Comment rechercher JSON tree avec jQuery

j'ai une question sur la recherche dans le JSON pour les informations spécifiques. Par exemple, j'ai ce fichier JSON:

 {
    "people": {
        "person": [
            {
                "name": "Peter",
                "age": 43,
                "sex": "male"
            }, {
                "name": "Zara",
                "age": 65,
                "sex": "female"
            }
        ]
    }
}

ma question Est, comment trouver une personne particulière par son nom et montrer l'âge de cette personne avec jQuery? Par exemple, je veux rechercher le JSON pour une personne appelée Peter et quand je trouve une correspondance je veux afficher des informations supplémentaires sur cette correspondance (à propos de la personne nommée Peter dans ce cas) comme l'âge de la personne par exemple.

63
demandé sur Pekka 웃 2011-03-13 13:35:51

11 réponses

var json = {
    "people": {
        "person": [{
            "name": "Peter",
            "age": 43,
            "sex": "male"},
        {
            "name": "Zara",
            "age": 65,
            "sex": "female"}]
    }
};
$.each(json.people.person, function(i, v) {
    if (v.name == "Peter") {
        alert(v.age);
        return;
    }
});

exemple .

basé sur ce réponse , vous pouvez utiliser quelque chose comme:

$(function() {
    var json = {
        "people": {
            "person": [{
                "name": "Peter",
                "age": 43,
                "sex": "male"},
            {
                "name": "Zara",
                "age": 65,
                "sex": "female"}]
        }
    };
    $.each(json.people.person, function(i, v) {
        if (v.name.search(new RegExp(/peter/i)) != -1) {
            alert(v.age);
            return;
        }
    });
});

exemple 2

90
répondu ifaour 2017-05-23 12:26:42

j'ai trouvé l'exemple de jQuery d'ifaour.chaque () pour être utile, mais ajouterait que jQuery.chaque() peut être cassé (c'est-à-dire arrêté) en retournant false au point où vous avez trouvé ce que vous recherchez:

$.each(json.people.person, function(i, v) {
        if (v.name == "Peter") {
            // found it...
            alert(v.age);
            return false; // stops the loop
        }
});
18
répondu Tapefreak 2011-08-23 15:00:51

vous pouvez utiliser Jsel - https://github.com/dragonworx/jsel .

il utilise un vrai moteur XPath et est hautement personnalisable. Fonctionne dans les deux noeuds.js et le navigateur.

étant donné votre question originale, vous trouverez le peuple par son nom avec:

// include or require jsel library (npm or browser)
var dom = jsel({
    "people": {
        "person": [{
            "name": "Peter",
            "age": 43,
            "sex": "male"},
        {
            "name": "Zara",
            "age": 65,
            "sex": "female"}]
    }
});
var person = dom.select("//person/*[@name='Peter']");
person.age === 43; // true

si vous travailliez toujours avec le même schéma JSON, vous pourriez créer votre propre schéma avec jsel, et être capable d'utiliser des expressions plus courtes comme:

dom.select("//person[@name='Peter']")
11
répondu Ali 2013-08-13 04:45:45

une fois que vous avez chargé le JSON dans un objet JavaScript, ce n'est plus un problème jQuery mais un problème JavaScript. Dans JavaScript vous pouvez par exemple écrire une recherche telle que:

var people = myJson["people"];
var persons = people["person"];
for(var i=0; i < persons.length; ++i) {
    var person_i = persons[i];
    if(person_i["name"] == mySearchForName) {
        // found ! do something with 'person_i'.
        break;
    }
}
// not found !
9
répondu DuckMaestro 2011-03-13 10:41:18

vous pouvez utiliser DefiantJS ( http://defiantjs.com ) qui étend l'objet global JSON avec la méthode"search". Avec lequel vous pouvez interroger les requêtes XPath sur les structures JSON. Exemple:

var byId = function(s) {return document.getElementById(s);},
data = {
   "people": {
      "person": [
         {
            "name": "Peter",
            "age": 43,
            "sex": "male"
         },
         {
            "name": "Zara",
            "age": 65,
            "sex": "female"
         }
      ]
   }
},
res = JSON.search( data, '//person[name="Peter"]' );

byId('name').innerHTML = res[0].name;
byId('age').innerHTML = res[0].age;
byId('sex').innerHTML = res[0].sex;

voici un violon de travail;

http://jsfiddle.net/hbi99/NhL7p /

7
répondu Hakan Bilgin 2014-01-05 11:56:28

il y a des js-libraries qui pourraient vous aider avec ça:

vous pouvez également jeter un oeil à Lawnchair , qui est un JSON-Document-Store qui fonctionne dans le navigateur et a toutes sortes d'interroger les mécanismes.

7
répondu Martin Schuhfuß 2016-01-22 00:14:27

vous pouvez rechercher sur un tableau d'objets json en utilisant $.grep () comme ceci:

var persons = {
    "person": [
        {
            "name": "Peter",
            "age": 43,
            "sex": "male"
        }, {
            "name": "Zara",
            "age": 65,
            "sex": "female"
        }
      ]
   }
};
var result = $.grep(persons.person, function(element, index) {
   return (element.name === 'Peter');
});
alert(result[0].age);
6
répondu Dexxo 2015-03-26 02:04:30
    var GDNUtils = {};

GDNUtils.loadJquery = function () {
    var checkjquery = window.jQuery && jQuery.fn && /^1\.[3-9]/.test(jQuery.fn.jquery);
    if (!checkjquery) {

        var theNewScript = document.createElement("script");
        theNewScript.type = "text/javascript";
        theNewScript.src = "http://code.jquery.com/jquery.min.js";

        document.getElementsByTagName("head")[0].appendChild(theNewScript);

        // jQuery MAY OR MAY NOT be loaded at this stage


    }
};



GDNUtils.searchJsonValue = function (jsonData, keytoSearch, valuetoSearch, keytoGet) {
    GDNUtils.loadJquery();
    alert('here' + jsonData.length.toString());
    GDNUtils.loadJquery();

    $.each(jsonData, function (i, v) {

        if (v[keytoSearch] == valuetoSearch) {
            alert(v[keytoGet].toString());

            return;
        }
    });



};




GDNUtils.searchJson = function (jsonData, keytoSearch, valuetoSearch) {
    GDNUtils.loadJquery();
    alert('here' + jsonData.length.toString());
    GDNUtils.loadJquery();
    var row;
    $.each(jsonData, function (i, v) {

        if (v[keytoSearch] == valuetoSearch) {


            row  = v;
        }
    });

    return row;



}
2
répondu cindy 2012-02-02 12:48:25

j'ai sorte de condition similaire plus ma requête de recherche non limité à la propriété de L'objet particulier ( comme" John " requête de recherche doit être apparié avec first_name et aussi avec last_name propriété ). Après avoir passé quelques heures, j'ai obtenu cette fonction de Google Angular projet. Ils se sont occupés de tous les cas possibles.

/* Seach in Object */

var comparator = function(obj, text) {
if (obj && text && typeof obj === 'object' && typeof text === 'object') {
    for (var objKey in obj) {
        if (objKey.charAt(0) !== '$' && hasOwnProperty.call(obj, objKey) &&
                comparator(obj[objKey], text[objKey])) {
            return true;
        }
    }
    return false;
}
text = ('' + text).toLowerCase();
return ('' + obj).toLowerCase().indexOf(text) > -1;
};

var search = function(obj, text) {
if (typeof text == 'string' && text.charAt(0) === '!') {
    return !search(obj, text.substr(1));
}
switch (typeof obj) {
    case "boolean":
    case "number":
    case "string":
        return comparator(obj, text);
    case "object":
        switch (typeof text) {
            case "object":
                return comparator(obj, text);
            default:
                for (var objKey in obj) {
                    if (objKey.charAt(0) !== '$' && search(obj[objKey], text)) {
                        return true;
                    }
                }
                break;
        }
        return false;
    case "array":
        for (var i = 0; i < obj.length; i++) {
            if (search(obj[i], text)) {
                return true;
            }
        }
        return false;
    default:
        return false;
}
};
2
répondu Hardik Sondagar 2014-06-20 10:11:44

vous n'avez pas à utiliser jQuery. Plaine JavaScript va faire. Je ne recommanderais aucune bibliothèque qui transfère les normes XML sur JavaScript, et j'ai été frustré qu'aucune autre solution n'existe pour cela, donc j'ai écrit ma propre bibliothèque.

j'ai adapté regex pour travailler avec JSON.

d'abord, stringifiez l'objet JSON. Ensuite, vous devez stocker les départs et les longueurs des substrats appariés. Par exemple:

"matched".search("ch") // yields 3

pour un JSON string, cela fonctionne exactement de la même manière (à moins que vous ne cherchiez explicitement les virgules et les crochets bouclés, auquel cas je recommanderais une transformation préalable de votre objet JSON avant d'exécuter regex (i.e. think:, {,}).

ensuite, vous devez reconstruire l'objet JSON. L'algorithme que j'ai écrit le fait en détectant la syntaxe JSON par recursive aller en arrière à partir de l'index de match. Par exemple, le pseudo-code pourrait ressembler à ceci:

find the next key preceding the match index, call this theKey
then find the number of all occurrences of this key preceding theKey, call this theNumber
using the number of occurrences of all keys with same name as theKey up to position of theKey, traverse the object until keys named theKey has been discovered theNumber times
return this object called parentChain

avec cette information, il est possible d'utiliser regex pour filtrer un objet JSON pour retourner la clé, la valeur, et la chaîne d'objet parent.

vous pouvez voir la bibliothèque et le code que j'ai écrit à http://json.spiritway.co /

0
répondu mgwhitfield 2015-03-28 02:44:06