2016-06-17 10 views
3

Dies ist ein Follow-up-Frage: Append to JSON array with ColdFusion, taking Null values into consideration?anhängen zu JSON-Array innerhalb eines JSON-Array Coldfusion

diese Frage gestern beantwortet wurde und funktionierte perfekt (Danke Kevin B. und Leigh!). Die Anwendung, aus der ich meine JSON-Daten entwerfe, warf mir heute Morgen einen Kurvenball zu. Manchmal, abhängig von der Daten ich anfordernden bin, gibt es die gesamte JSON als ein Array wie folgt aus:

[ 
    { 
     "loginHosts": [ 
     "server1.example.com" 
     ], 
     "sudoHosts": [ 
     "server1.example.com" 
     ], 
     "CPG": [ 
     "my_group" 
     ], 
     "mail": "[email protected]", 
     "loginShell": "/bin/bash" 
    } 
] 

Ich weiß nicht, warum die Anwendung dies tut. Wenn ich wüsste, dass dies eine Möglichkeit wäre, hätte ich diese Information meiner vorherigen Frage hinzugefügt, entschuldige mich.

Meine Versuche, eine Lösung zu finden, führen mich hier zuerst: Using JSON Data with Coldfusion. Das Schleifen über das JSON-Array als Sammlung schien zu funktionieren, aber nur, wenn keiner der Array-Werte Null war. Ich dachte, mit diesem Code, wie in der vorherigen Frage, funktionieren würde, wenn ich es für alle JSON Felder verwendet:

<cfif NOT structKeyExists(myStruct, 'sudoHosts') OR NOT isArray(myStruct.sudoHosts)> 
    <cfset myStruct.sudoHosts = []> 
</cfif> 

Dies war nicht der Fall. Ich bekomme ständig:

Error: Can't cast Complex Object Type Array to String

durch die Debug-Ausgabe der Suche, hat Lucee dies heraus werfen: string Use Built-In-Function "serialize(Array):String" to create a String from Array. Ich habe mehr gegraben und diesen Artikel gefunden: Railo tip: store complex data by using serialize(data). Leider haben Nullwerte wieder zugeschlagen. Auch mein Verständnis ist ist ähnlich wie evaluate(), und nicht zu empfehlen.

Ich werde weiterhin nach einer Lösung suchen, aber jede Hilfe wird, wie immer, sehr geschätzt!

- EDIT -

ich auf diesen Thread kam: ColdFusion JSON object vs array of objects. Ich habe festgestellt, dass der JSON in der Frage ein ARRAY [] ist, und ich habe die Antwort auf meinen Code angewendet, laufe aber immer noch in das Null-Problem. Ich denke, ich weiß nicht, wie man nach verschachtelten Nullwerten sucht. :(

+0

Warum denkst du das: 'Auch mein Verständnis ist serialize() ist ähnlich zu evaluate() und nicht gut zu bedienen.'? –

+0

Evaluate() ist tendenziell langsamer, auch wenn es geringfügig langsamer ist, und serialize() scheint ähnlich wie evaluate() zu arbeiten. Das beste Beispiel, das ich gefunden habe, war hier: http://blog.adamcameron.me/2013/08/evaluulate-is-really-slow-is-it-now.html Nach dem Durchlesen verschiedener anderer Dokumente scheint serialize() das zu haben Gleicher Overhead. Jeder Kilometerstand kann variieren. : D – Grimdari

Antwort

1

Nehmen Sie es ein Schritt zu einer Zeit.

Idealerweise sollten Sie festzustellen, warum die Antwort unterscheidet. Da Sie diese Unterschiede sagen in der Regel etwas entsprechen verschiedenen in Ihre Anfrage, dass stark darauf hin, können Sie Wenn ich etwas in der Remote-API übersehen (oder möglicherweise missverstehen) würde, würde ich empfehlen, die API erneut zu überprüfen, um das "Etwas" zu identifizieren, um den richtigen Ansatz zu finden. Andernfalls wird der Code schnell unübersichtlich und ineffizient um es zu ändern, um jede "neue" Situation zu behandeln.

Wenn aus irgendeinem Grund die API wirklich ist, die verschiedene Ergebnisse ohne einen gültigen Grund zurückgibt, ist das Beste, was Sie tun können, nach dem Code erwarten Sie und scheitern anmutig, wenn Sie etwas anderes erhalten.Beginnen Sie mit den erwarteten Möglichkeiten Auflistung:

  1. Response ist eine einzelne Struktur bestimmte Tasten OR
  2. Antwort enthält, ist ein Array von Strukturen, die bestimmte Schlüssel

auf der oben basiert, können Sie die IsArray verwenden und IsStruct Funktionen, um das Format der Antwort zu bestimmen und entsprechend zu behandeln. Untersuchen Sie zunächst das deserialisierte Objekt. Wenn es sich um ein Array handelt, extrahiere die Struktur im ersten Element (). Ich gehe davon aus, dass das Array nur ein einzelnes Element enthält, wie im Beispiel. Wenn es mehrere Elemente enthalten kann, benötigen Sie zusätzliche Behandlung).

Als nächstes überprüfen Sie, ob Sie jetzt mit einer Struktur arbeiten, die die erwarteten Schlüssel enthält. Wenn ja, fahren Sie mit Ihrer üblichen Verarbeitung fort. Andernfalls ist etwas Unerwartetes passiert und der Code sollte die entsprechende Fehlerbehandlung durchführen.

<!--- Verify object is a structure and contains expected key(s) ---> 
<cfif IsStruct(data) && structKeyExists(data, "loginHosts")> 
    ... process data as usual 
<cfelse> 
    ... data is not in expected format, do error handling here 
</cfif> 

Das Vorstehende ist ein sehr schnell und schmutzig Beispiel, soll aber die Grundidee demonstrieren. Solange Sie sicher sind, dass Sie die API korrekt verwenden, können Sie nur für den erwarteten Code Code schreiben und dann fehlerfrei ablaufen, wenn etwas anderes passiert.

+0

Wenn ich jetzt daran arbeite, werde ich ein paar Aufgaben erledigen. – Grimdari

+0

Während die Grundvoraussetzung von * "erwartete Bedingungen handhaben, und für alles andere elegant fehlschlagen" * ist solide, sollten Sie wirklich versuchen und herausfinden, warum es passiert. Der Grund dafür ist, dass wenn Sie die API missverstehen und das Array möglicherweise * multiple * Elemente enthält, dann wäre ein anderer Ansatz gerechtfertigt. – Leigh

+0

Ich habe ein paar Anrufe getätigt. Anscheinend ist die API nicht vollständig. Was ich entdeckt habe, ist nur ein Teil eines Features, das implementiert wurde. Für jetzt muss ich weiter damit umgehen. Außerdem funktioniert Ihre Empfehlung oben. Die cfset data = data [1] lösten eine Glühbirne in meinem Kopf aus. : D Es hat jedoch ein anderes Problem verursacht, das ich versuche durchzuarbeiten. – Grimdari