Ausgehend von der Antwort von @Alnitak habe ich diesen Quellcode erstellt, der eine aktuelle JSON-Datei herunterlädt und verarbeitet, wobei für jeden Schritt erklärende Zeichenfolgen auf der Konsole ausgegeben werden, sowie weitere Details, falls ein falscher Schlüssel übergeben wird:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<script>
function retrieveURL(url) {
var client = new XMLHttpRequest();
prefix = "https://cors-anywhere.herokuapp.com/"
client.open('GET', prefix + url);
client.responseType = 'text';
client.onload = function() {
response = client.response; // Load remote response.
console.log("Response received.");
parsedJSON = JSON.parse(response);
console.log(parsedJSON);
console.log(JSONitemByPath(parsedJSON,"geometry[6].obs[3].latituade"));
return response;
};
try {
client.send();
} catch(e) {
console.log("NETWORK ERROR!");
console.log(e);
}
}
function JSONitemByPath(o, s) {
structure = "";
originalString = s;
console.log("Received string: ", s);
s = s.replace(/\[(\w+)\]/g, '.$1'); // convert indexes to properties
console.log("Converted to : ", s);
s = s.replace(/^\./, ''); // strip a leading dot
var a = s.split('.');
console.log("Single keys to parse: ",a);
for (var i = 0, n = a.length; i < n; ++i) {
var k = a[i];
if (k in o) {
o = o[k];
console.log("object." + structure + a[i], o);
structure += a[i] + ".";
} else {
console.log("ERROR: wrong path passed: ", originalString);
console.log(" Last working level: ", structure.substr(0,structure.length-1));
console.log(" Contents: ", o);
console.log(" Available/passed key: ");
Object.keys(o).forEach((prop)=> console.log(" "+prop +"/" + k));
return;
}
}
return o;
}
function main() {
rawJSON = retrieveURL("http://haya2now.jp/data/data.json");
}
</script>
</head>
<body onload="main()">
</body>
</html>
Beispiel für die Ausgabe:
Response received.
json-querier.html:17 {geometry: Array(7), error: Array(0), status: {…}}
json-querier.html:34 Received string: geometry[6].obs[3].latituade
json-querier.html:36 Converted to : geometry.6.obs.3.latituade
json-querier.html:40 Single keys to parse: (5) ["geometry", "6", "obs", "3", "latituade"]
json-querier.html:46 object.geometry (7) [{…}, {…}, {…}, {…}, {…}, {…}, {…}]
json-querier.html:46 object.geometry.6 {hayabusa2: {…}, earth: {…}, obs: Array(6), TT: 2458816.04973593, ryugu: {…}, …}
json-querier.html:46 object.geometry.6.obs (6) [{…}, {…}, {…}, {…}, {…}, {…}]
json-querier.html:46 object.geometry.6.obs.3 {longitude: 148.98, hayabusa2: {…}, sun: {…}, name: "DSS-43", latitude: -35.4, …}
json-querier.html:49 ERROR: wrong path passed: geometry[6].obs[3].latituade
json-querier.html:50 Last working level: geometry.6.obs.3
json-querier.html:51 Contents: {longitude: 148.98, hayabusa2: {…}, sun: {…}, name: "DSS-43", latitude: -35.4, …}
json-querier.html:52 Available/passed key:
json-querier.html:53 longitude/latituade
json-querier.html:53 hayabusa2/latituade
json-querier.html:53 sun/latituade
json-querier.html:53 name/latituade
json-querier.html:53 latitude/latituade
json-querier.html:53 altitude/latituade
json-querier.html:18 undefined
0 Stimmen
Sie sind sich nicht sicher, was Sie hier fragen? Möchten Sie part1.name abfragen können und den Text "part1.name" zurückerhalten? Oder möchten Sie den in part1.name gespeicherten Wert abrufen?
0 Stimmen
Haben Sie versucht, etwas zu tun wie
var part1name = someObject.part1name;
`1 Stimmen
@BonyT : Ich möchte someObject.part1.name abfragen und den Wert davon zurückgeben ("Part 1"). Ich möchte jedoch, dass die Abfrage (ich nannte sie "den Schlüssel") in einer Variablen 'part1name' gespeichert wird. Vielen Dank für Ihre Antwort. @3nigma : Das habe ich sicherlich. Aber das ist nicht meine Absicht. Vielen Dank für die Antwort.
1 Stimmen
In der doppelten Antwort, ich liebe die Antwort von fyr stackoverflow.com/questions/8817394/
1 Stimmen
Siehe auch JavaScript-Zeichenfolge in Punktnotation in eine Objektreferenz umwandeln
0 Stimmen
Werfen Sie einen Blick auf JSONPath: github.com/jayway/JsonPath
0 Stimmen
Das funktioniert gut npmjs.com/package/objekt-pfad