Как получить из Json - все блоки - у которых имя...

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 522
Благодарностей
1 320
Баллы
113
Всем доброго времени суток. Искал библиотеки по JsonPath - что бы решить свою задачу, но не смог найти, если у вас есть в заначке, буду очень благодарен. Все что я смог найти, так это краткую библиотеку на английском. Но я не понял как с помощью ее получить то, что мне нужно.

Есть API Json:
C#:
{
  "objects": [
    {
      "itemId": "b68d-17f9a315aadc",
      "type": "ofr",
      "amount": 1,
      "classId": "0:3783832",
      "gameId": "a8db",
      "inMarket": true,
      "lockStatus": false,
      "title": "Chroms2",
      "description": "Container",
      "slug": "chroma",
      "owner": "92b4395ef9581353",
      "ownersBlockchainId": "3acdafbfdb8f049ab77fdd050987ec3b12c",
      "status": "active",
      "discount": 33,
      "price": {
        "DMC": "",
        "USD": "2"
      },
      
        {
  "objects": [
    {
      "itemId": "b68d-17f9a315aadc",
      "type": "ofr",
      "amount": 1,
      "classId": "0:3783832",
      "gameId": "a8db",
      "inMarket": true,
      "lockStatus": false,
      "title": "Chroms",
      "description": "Container",
      "slug": "chroma",
      "owner": "92b4395ef9581353",
      "ownersBlockchainId": "3acdafbfdb8f049ab77fdd050987ec3b12c",
      "status": "active",
      "discount": 33,
      "price": {
        "DMC": "",
        "USD": "2"
      },
      
        {
  "objects": [
    {
      "itemId": "b68d-17f9a315aadc",
      "type": "ofr",
      "amount": 1,
      "classId": "0:3783832",
      "gameId": "a8db",
      "inMarket": true,
      "lockStatus": false,
      "title": "Chroms",
      "description": "Container",
      "slug": "chroma",
      "owner": "92b4395ef9581353",
      "ownersBlockchainId": "3acdafbfdb8f049ab77fdd050987ec3b12c",
      "status": "active",
      "discount": 33,
      "price": {
        "DMC": "",
        "USD": "3"
      },
Для нахождения значений, использую Конструктор XPath Zenno - как мне найти все обьекты, у которых title = Chroms? или у которых USD = 3?
Эта инструкция мне не помогла - $..book[?(@.price<10)]


Заранее, очень благодарен за ответ.
 

nouazak

Client
Регистрация
07.06.2018
Сообщения
101
Благодарностей
26
Баллы
28
Всем доброго времени суток. Искал библиотеки по JsonPath - что бы решить свою задачу, но не смог найти, если у вас есть в заначке, буду очень благодарен. Все что я смог найти, так это краткую библиотеку на английском. Но я не понял как с помощью ее получить то, что мне нужно.

Есть API Json:
C#:
{
  "objects": [
    {
      "itemId": "b68d-17f9a315aadc",
      "type": "ofr",
      "amount": 1,
      "classId": "0:3783832",
      "gameId": "a8db",
      "inMarket": true,
      "lockStatus": false,
      "title": "Chroms2",
      "description": "Container",
      "slug": "chroma",
      "owner": "92b4395ef9581353",
      "ownersBlockchainId": "3acdafbfdb8f049ab77fdd050987ec3b12c",
      "status": "active",
      "discount": 33,
      "price": {
        "DMC": "",
        "USD": "2"
      },
     
        {
  "objects": [
    {
      "itemId": "b68d-17f9a315aadc",
      "type": "ofr",
      "amount": 1,
      "classId": "0:3783832",
      "gameId": "a8db",
      "inMarket": true,
      "lockStatus": false,
      "title": "Chroms",
      "description": "Container",
      "slug": "chroma",
      "owner": "92b4395ef9581353",
      "ownersBlockchainId": "3acdafbfdb8f049ab77fdd050987ec3b12c",
      "status": "active",
      "discount": 33,
      "price": {
        "DMC": "",
        "USD": "2"
      },
     
        {
  "objects": [
    {
      "itemId": "b68d-17f9a315aadc",
      "type": "ofr",
      "amount": 1,
      "classId": "0:3783832",
      "gameId": "a8db",
      "inMarket": true,
      "lockStatus": false,
      "title": "Chroms",
      "description": "Container",
      "slug": "chroma",
      "owner": "92b4395ef9581353",
      "ownersBlockchainId": "3acdafbfdb8f049ab77fdd050987ec3b12c",
      "status": "active",
      "discount": 33,
      "price": {
        "DMC": "",
        "USD": "3"
      },
Для нахождения значений, использую Конструктор XPath Zenno - как мне найти все обьекты, у которых title = Chroms? или у которых USD = 3?
Эта инструкция мне не помогла - $..book[?(@.price<10)]


Заранее, очень благодарен за ответ.
не пробовал использовать кубик "парсинг JSON" ?
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 522
Благодарностей
1 320
Баллы
113

nouazak

Client
Регистрация
07.06.2018
Сообщения
101
Благодарностей
26
Баллы
28
как мне найти все обьекты, у которых title = Chroms? или у которых USD = 3?
ты спрашивал это, после парсинга спокойно можешь сравнивать значения этих переменных. Если тебе нужно не это, значит я тебя не понял
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 522
Благодарностей
1 320
Баллы
113
Каким образом мне сравнить 1000+ переменных одновременно?
ты спрашивал это, после парсинга спокойно можешь сравнивать значения этих переменных. Если тебе нужно не это, значит я тебя не понял
 

molotok

Client
Регистрация
17.04.2015
Сообщения
733
Благодарностей
358
Баллы
63

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 522
Благодарностей
1 320
Баллы
113
Только я вот не понял, последняя строки - туда только переменную с Json вписывать? Если да, то не понимаю в чем ее суть. Мне нужно узнать, содержит ли определенное слово Json текст. Как применить этот код, что бы это сделать?
C#:
string test = project.Variables["LootJsonALL"].Value; //данные в json, например: {"message":8,"contact":1}
project.Json.FromString(test); //Распаршивание данных json в переменные зеннопостера (вкладка json)
return project.Json.objects[0].type; //Парсим значение конкретной строки
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
как мне найти все обьекты, у которых title = Chroms? или у которых USD = 3?
Все просто, тебе необходимо:
1. Цикл перебора объектов
2. Проверка условия if
3. Я рекомендую использоваться библиотеку Newtonsoft.Json.

C#:
// Условный пример, как это можно сделать.
for (int i = 0; i < o.SelectToken("$.objects").Count(); i++) {
if (o.SelectToken("$.title["+i+"]") == "Chroms" && o.SelectToken("$.price["+i+"]") == "3")
}
 
  • Спасибо
Реакции: djaga и Gunjubasik

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 522
Благодарностей
1 320
Баллы
113
Спасибо конечно, но я думал, в 2020 можно было сделать проще - 1ним JSON кодом, по крайней мере мне так казалось, когда я использовал конструктор json - где можно одной строкой узнать как минимум все значения переменной - которых цена ниже...$..book[?(@.price<10)] Думал будет работать = вместо < , но не тут то было. Поэтому и задал вопрос, может кто-то посоветует JSON библиотеку - где одной строчкой можно будет все решать, а не перебором?

И еще одно, XPath - не умеет нормально работать с JSON конструктивом, верно?
Все просто, тебе необходимо:
1. Цикл перебора объектов
2. Проверка условия if
3. Я рекомендую использоваться библиотеку Newtonsoft.Json.

C#:
// Условный пример, как это можно сделать.
for (int i = 0; i < o.SelectToken("$.objects").Count(); i++) {
if (o.SelectToken("$.title["+i+"]") == "Chroms" && o.SelectToken("$.price["+i+"]") == "3")
}
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
где можно одной строкой узнать как минимум все значения
Это обычный тестер путей, у которого под капотом лежит цикл перебора.
Нет такой библиотеки, которая одной строчной будет делать за вас магию, но её можно самому сделать, под конкретные задачи.
И еще одно, XPath - не умеет нормально работать с JSON конструктивом, верно?
xPath отличается от JSON, пути не совместимы.
 
  • Спасибо
Реакции: Gunjubasik

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)