1. ホーム
  2. json

ロジックをデータとしてJSONで表現する

2023-08-14 19:36:42

質問

ビジネス上の理由から、いくつかの条件付きロジックを外部ファイル(できればJSON)に外部化する必要があります。

単純なフィルターバイシナリオは、以下のようにノードを追加することで処理できます。

"filter": [
  {
    "criteria": "status",
    "value": "open",
    "condition": "=="
  }
]

複数の条件を配列の追加値で処理することができた。

"filter": [
  {
    "criteria": "status",
    "value": "open",
    "condition": "=="
  },
  {
    "criteria": "condition2",
    "value": "value2",
    "condition": "=="
  }
]

しかし、ANDやORを含む複雑な条件を扱う場合は、少し混乱します。

質問:JSON内でそのようなロジックを表現するための標準化された(あるいは広く受け入れられた)フォーマットはありますか?もしあなた次第であれば、どのようにそれを行いますか?

注:最初の回答は編集可能なwikiにしたので、それを感じたら誰でも改善することができます。

どのように解決するのですか?

もし、あなたが が必要です。 を実装しなければならない場合、Lisp の "S-expressions" のようなものをお勧めします。 条件は、プレーン オブジェクトか、最初のエントリがそれらを結合する論理演算である配列のどちらかにすることができます。

たとえば

["AND",
    {"var1" : "value1"},
    ["OR",
        { "var2" : "value2" },
        { "var3" : "value3" }
    ]
]

var1 == value1 AND (var2 == value2 OR var3 == value3) .

一貫性よりも簡潔さを重視するのであれば、オブジェクトが複数のプロパティを持つことも可能で、その場合は暗黙のうちにANDで結合されることになります。 例えば { "a": "b", "c": "d" } は次のように等価です。 ["AND", { "a": "b" }, { "c": "d" }] . しかし、(この例のように)前者の構文では条件を忠実に表現できない場合があります。条件を翻訳したり、ダミーのプロパティ名を使用するなどの追加のトリックが必要になります。 後者の構文は常に機能するはずです。