Извлеките последовательный элемент массива из массива с помощью JSONPath без использования индекса, только по их значению

#jsonpath #json-path-expression

Вопрос:

У меня есть тело json, как показано ниже —

     {
  "type": "SourceUnit",
  "children": [
    {
      "type": "PragmaDirective",
      "name": "solidity",
      "value": ">=0.4.22 <0.9.0"
    },
    {
      "type": "ContractDefinition",
      "name": "txorigin",
      "baseContracts": [],
      "subNodes": [],
      "kind": "contract"
    }
  ],
  "tokens": [
    {
      "type": "Keyword",
      "value": "pragma"
    },
    {
      "type": "Identifier",
      "value": "solidity"
    },
    {
      "type": "Punctuator",
      "value": ">="
    },
    {
      "type": "Version",
      "value": "0.4.22"
    },
    {
      "type": "Punctuator",
      "value": "<"
    },
    {
      "type": "Version",
      "value": "0.9.0"
    },
    {
      "type": "Punctuator",
      "value": ";"
    },
    {
      "type": "Keyword",
      "value": "contract"
    },
    {
      "type": "Identifier",
      "value": "txorigin"
    },
    {
      "type": "Punctuator",
      "value": "{"
    },
    {
      "type": "type",
      "value": "address"
    },
    {
      "type": "Identifier",
      "value": "owner"
    },
    {
      "type": "Punctuator",
      "value": ";"
    },
    {
      "type": "Keyword",
      "value": "constructor"
    },
    {
      "type": "Punctuator",
      "value": "("
    },
    {
      "type": "Punctuator",
      "value": ")"
    },
    {
      "type": "Keyword",
      "value": "public"
    },
    {
      "type": "Punctuator",
      "value": "{"
    },
    {
      "type": "Identifier",
      "value": "owner"
    },
    {
      "type": "Punctuator",
      "value": "="
    },
    {
      "type": "Identifier",
      "value": "msg"
    },
    {
      "type": "Punctuator",
      "value": "."
    },
    {
      "type": "Identifier",
      "value": "sender"
    },
    {
      "type": "Punctuator",
      "value": ";"
    },
    {
      "type": "Punctuator",
      "value": "}"
    },
    {
      "type": "Keyword",
      "value": "function"
    },
    {
      "type": "Identifier",
      "value": "sendTo"
    },
    {
      "type": "Punctuator",
      "value": "("
    },
    {
      "type": "type",
      "value": "address"
    },
    {
      "type": "Identifier",
      "value": "receiver"
    },
    {
      "type": "Punctuator",
      "value": ","
    },
    {
      "type": "type",
      "value": "uint"
    },
    {
      "type": "Identifier",
      "value": "amount"
    },
    {
      "type": "Punctuator",
      "value": ")"
    },
    {
      "type": "Keyword",
      "value": "public"
    },
    {
      "type": "Punctuator",
      "value": "{"
    },
    {
      "type": "Identifier",
      "value": "require"
    },
    {
      "type": "Punctuator",
      "value": "("
    },
    {
      "type": "Identifier",
      "value": "tx"
    },
    {
      "type": "Punctuator",
      "value": "."
    },
    {
      "type": "Identifier",
      "value": "origin"
    },
    {
      "type": "Punctuator",
      "value": "=="
    },
    {
      "type": "Identifier",
      "value": "owner"
    },
    {
      "type": "Punctuator",
      "value": ")"
    },
    {
      "type": "Punctuator",
      "value": ";"
    },
    {
      "type": "Punctuator",
      "value": "("
    },
    {
      "type": "type",
      "value": "bool"
    },
    {
      "type": "Identifier",
      "value": "success"
    },
    {
      "type": "Punctuator",
      "value": ","
    },
    {
      "type": "Punctuator",
      "value": ")"
    },
    {
      "type": "Punctuator",
      "value": "="
    },
    {
      "type": "Identifier",
      "value": "receiver"
    },
    {
      "type": "Punctuator",
      "value": "."
    },
    {
      "type": "Identifier",
      "value": "call"
    },
    {
      "type": "Punctuator",
      "value": "."
    },
    {
      "type": "Identifier",
      "value": "value"
    },
    {
      "type": "Punctuator",
      "value": "("
    },
    {
      "type": "Identifier",
      "value": "amount"
    },
    {
      "type": "Punctuator",
      "value": ")"
    },
    {
      "type": "Punctuator",
      "value": "("
    },
    {
      "type": "Keyword",
      "value": ""
    },
    {
      "type": "Punctuator",
      "value": ")"
    },
    {
      "type": "Punctuator",
      "value": ";"
    },
    {
      "type": "Identifier",
      "value": "require"
    },
    {
      "type": "Punctuator",
      "value": "("
    },
    {
      "type": "Identifier",
      "value": "success"
    },
    {
      "type": "Punctuator",
      "value": ")"
    },
    {
      "type": "Punctuator",
      "value": ";"
    },
    {
      "type": "Punctuator",
      "value": "}"
    },
    {
      "type": "Punctuator",
      "value": "}"
    },
    {
      "type": "Keyword",
      "value": "<EOF>"
    }
  ]
}
 

всякий раз, когда выполняется какой-либо код, я хочу проверить, доступны ли указанные выше значения «tx»,».», «происхождение» в моем сгенерированном json или нет. и это должно быть последовательно, как (tx.origin). если он доступен, он что-то вернет. Я могу получить любое одно значение — .токены[?(@.value == «tx»)].значение
Мне нужно проверить все 3 последовательно.

Не могли бы вы, ребята, мне помочь? Заранее спасибо.

Комментарии:

1. Я бы предложил использовать схему JSON для проверки. Затем, если данные подтвердятся, вы можете просто получить доступ к значениям напрямую, так как знаете, где они находятся.

2. @gregsdennis , в этом проблема, я не знаю, где находятся значения, я имею в виду, что я не могу получить индекс в своем пути json. есть и другие поля, которые также могут изменять местоположение/индекс указанных выше значений

Ответ №1:

Другой вариант-просто получить значения

 $.tokens[*].value
 

Это даст вам все ценности. Они должны быть в правильной последовательности, но нет никакой гарантии.