3

これはフォローアップの質問です: Null 値を考慮して、ColdFusion で JSON 配列に追加しますか?

その質問は昨日回答され、完璧に機能しました (Kevin B. と Leigh に感謝します!)。しかし、今朝、JSON データを取得しているアプリケーションが急変しました。 要求しているデータによっては、JSON 全体を次のような配列として返す場合があります

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

そのアプリケーションがこれを行う理由がわかりません。これが可能性であることがわかっていれば、その情報を前の質問に追加したはずです。申し訳ありません。

解決策を見つけようとする私の試みは、最初に私をここに導きました: Coldfusion での JSON データの使用。コレクションとしての JSON 配列のループは機能しているように見えましたが、配列値がどれも Null でない場合のみでした。前の質問のように、このコードを使用すると、すべての JSON フィールドに使用するとうまくいくと思いました。

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

そうではありませんでした。私は継続的に得ます:

エラー: 複合オブジェクト型配列を文字列にキャストできません

デバッグ出力を調べると、Lucee はこれをスローしました: string Use Built-In-Function "serialize(Array):String" to create a String from Array. さらに掘り下げて、次の記事を見つけました: Railo のヒント: serialize(data) を使用して複雑なデータを格納します。悲しいことに、Null 値が再び発生しました。また、私の理解はserialize()に似てevaluate()おり、お勧めしません。

解決策を探し続けますが、いつものように、どんな助けも大歓迎です!

- 編集 -

このスレッドに出くわしました: ColdFusion JSON object vs array of objects。質問の JSON が ARRAY であることに気付き、[]コードに回答を適用しましたが、まだ Null 問題が発生しています。ネストされた Null 値をチェックする方法がわかりません。:(

4

1 に答える 1

1

一歩ずつ進んでください。

理想的には、応答が異なる理由を特定する必要があります。これらの違いは通常、リクエストの違いに対応していると言うので、リモート API の何かを見落としている (または誤解している可能性がある) ことを強く示唆しています。正しいアプローチを見つけるために、API を再確認してその「何か」を特定することをお勧めします。そうしないと、「新しい」状況ごとにコードを微調整し続けるため、コードはすぐに管理不能になり、非効率的になります。

何らかの理由で APIが正当な理由なく実際に異なる結果返す場合、最善の方法は、期待どおりにコーディングし、別の結果を受け取ったときに適切に失敗することです。予想される可能性をリストすることから始めます。

  1. 応答は、特定のキーを含む単一の構造です OR
  2. 応答は、特定のキーを含む構造体の配列です

上記に基づいて、IsArrayおよびIsStruct関数を使用して応答の形式を決定し、それに応じて処理できます。最初に、逆シリアル化されたオブジェクトを調べます。配列の場合は、最初の要素の構造を抽出します (注: 例のように、配列には 1 つの要素のみが含まれていると想定しています。複数の要素を含むことができる場合は、追加の処理が必要になります)。

<cfset data = deserializeJson(originalJSON)>
....
<!--- Extract structure from first element of array --->
<cfif IsArray(data) && arrayLen(data)>
    <cfset data = data[1]>
</cfif>

次に、予想されるキーを含む構造体で作業していることを確認します。その場合は、通常の処理を続行してください。それ以外の場合は、予期しないことが発生したため、コードは適切なエラー処理を実行する必要があります。

<!--- 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>

上記は非常に簡単で汚い例ですが、基本的な考え方を示す必要があります。API を正しく使用していることが確実である限り、できることは期待どおりのコードを作成することだけであり、何か別のことが起こったときに正常に失敗します。

于 2016-06-17T17:24:32.207 に答える