Удалить несколько блоков из JSON

Deisler

Client
Регистрация
26.10.2019
Сообщения
486
Благодарностей
191
Баллы
43
Всем привет. Есть достаточно большой JSON. В котором содержится много нужной и много ненужной информации. Нужно этот JSON очистить от ненужных блоков. Как можно это сделать ? Может JsonPath можно составить так что бы можно было указать какие блоки исключить ? Или на C# ?

Регулярками удалять не слишком удобно, т.к. не всегда за блоком, который надо удалить будет один и тот же ключ...

Приложу небольшой кусок кода. Допустим в нем надо полностью удалить 2 блока bargainOffer и comparison Как это сделать ?
JSON:
{
  "buyerItem": {
    "abFeatures": {
      "isCartEnabled": false,
      "isSplitAdvertBlock": false,
      "jobs_disclaimer_on_serp": false,
      "move_date_iv.test": false,
      "srv_sticky_booking_btn_desktop.sticky_booking_button": false
    },
    "abacPolicies": {},
    "actionScenario": {
      "closeItem": "item_closed",
      "selfItem": "item_self_user",
      "selfItemPushup": "item_self_user_pushup"
    },
    "advancedParamsBlock": {
      "items": [],
      "title": ""
    },
    "appIndexingUrls": [
      "android-app://com.avito.android/ru.avito/1/items/2656227935",
      "ios-app://417281773/ru.avito/1/items/2656227935"
    ],
    "autoParams": null,
    "bargainOffer": {
      "buttonTitle": "Отправить",
      "form": {
        "description": {
          "displaying": {
            "multiline": true
          },
          "id": 2,
          "inputType": null,
          "motivation": null,
          "placeholder": "Сообщение увидит продавец",
          "required": false,
          "title": "Аргументируйте, если хотите",
          "type": "char"
        },
        "price": {
          "displaying": null,
          "id": 1,
          "inputType": "numeric",
          "motivation": {
            "text": "В объявлении — 3 849 999 ₽"
          },
          "placeholder": "₽",
          "required": true,
          "title": "Ваша цена",
          "type": "char"
        }
      },
      "template": "Здравствуйте! Могу предложить {{1}} ₽. {{2}}",
      "title": "Предложите цену"
    },
    "cVState": null,
    "campaigns": null,
    "carMarketPrice": null,
    "closedItem": false,
    "closedItemSerpLink": null,
    "closedItemSerpLinkText": "",
    "closedItemStatus": "",
    "comparison": {
      "canBeAdded": false,
      "isAdded": false,
      "isToggleEnabled": true,
      "show": true
    }
  }
}
 

Вложения

Последнее редактирование:
  • Спасибо
Реакции: 5sdylt7 и djaga

Deisler

Client
Регистрация
26.10.2019
Сообщения
486
Благодарностей
191
Баллы
43
Кто-нибудь ? ) Любые предложения... )
 

nexx1

Client
Регистрация
16.08.2016
Сообщения
281
Благодарностей
98
Баллы
28
C#:
string jsonString = project.Variables[json].Value;
string key = project.Variables["key"].Value;
JObject obj = JObject.Parse(jsonString);
obj.Remove(key);
Newtonsoft.Json
как-то так возможно
 

Deisler

Client
Регистрация
26.10.2019
Сообщения
486
Благодарностей
191
Баллы
43
C#:
string jsonString = project.Variables[json].Value;
string key = project.Variables["key"].Value;
JObject obj = JObject.Parse(jsonString);
obj.Remove(key);
Newtonsoft.Json
как-то так возможно
Для этого надо какую то библиотеку установить ?

UP: Да, вижу, вы указали. Спасибо. Буду пробовать
 

Deisler

Client
Регистрация
26.10.2019
Сообщения
486
Благодарностей
191
Баллы
43
ИТОГОВОЕ РЕШЕНИЕ

Умные люди помогли разобраться в вопросе. Никакие библиотеки подключать не нужно.

Если нам надо удалить ключ, который "вложен" в другой ключ, то в коде надо прописать весь путь до ключа, который нужно удалить. То есть для моей изначальной задачи код выглядит так

C#:
string jsonString = project.Variables["JSON"].Value;  //JSON, который нам надо обработать
JObject obj = JObject.Parse(jsonString);
obj.SelectToken("buyerItem").SelectToken("bargainOffer").Parent.Remove(); // таким каскадом указываем путь до ключа, который надо удалить
obj.SelectToken("buyerItem").SelectToken("comparison").Parent.Remove();  // путь до второго ключа, который удаляем
return obj;


Если же нужно удалить ключ из Json, который никуда не вложен, то используем этот код
C#:
string jsonString = project.Variables["del"].Value;  //JSON, который нам надо обработать
JObject obj = JObject.Parse(jsonString);
//obj.SelectToken("buyerItem").SelectToken("abFeatures").Parent.Remove();
obj.Remove("buyerItem");  Удаление ключа, который не вложен в другие ключи
return obj;
 
Последнее редактирование:

finista

Client
Регистрация
10.10.2012
Сообщения
365
Благодарностей
57
Баллы
28
Регуляркой может удалить?
 

Deisler

Client
Регистрация
26.10.2019
Сообщения
486
Благодарностей
191
Баллы
43
Регуляркой может удалить?
Не, решение выше ) Регулярками, конечно, можно удалять, до тех пор пока вы не сталкнетесь с сайтом, у которого блоки json находятся не на одном и том же месте от раза к разу.
 
  • Спасибо
Реакции: finista

Iv1

Client
Регистрация
21.02.2016
Сообщения
1 950
Благодарностей
774
Баллы
113
ИТОГОВОЕ РЕШЕНИЕ

Умные люди помогли разобраться в вопросе. Никакие библиотеки подключать не нужно.

Если нам надо удалить ключ, который "вложен" в другой ключ, то в коде надо прописать весь путь до ключа, который нужно удалить. То есть для моей изначальной задачи код выглядит так

C#:
string jsonString = project.Variables["JSON"].Value;  //JSON, который нам надо обработать
JObject obj = JObject.Parse(jsonString);
obj.SelectToken("buyerItem").SelectToken("bargainOffer").Parent.Remove(); // таким каскадом указываем путь до ключа, который надо удалить
obj.SelectToken("buyerItem").SelectToken("comparison").Parent.Remove();  // путь до второго ключа, который удаляем
return obj;


Если же нужно удалить ключ из Json, который никуда не вложен, то используем этот код
C#:
string jsonString = project.Variables["del"].Value;  //JSON, который нам надо обработать
JObject obj = JObject.Parse(jsonString);
//obj.SelectToken("buyerItem").SelectToken("abFeatures").Parent.Remove();
obj.Remove("buyerItem");  Удаление ключа, который не вложен в другие ключи
return obj;
Ошибка в действии "CS0246" "The type or namespace name 'JObject' could not be found (are you missing a using directive or an assembly reference?)". [Строка: 2; Cтолбец: 1]

Что не так? Почему не находит?
 

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
776
Благодарностей
520
Баллы
93
Ошибка в действии "CS0246" "The type or namespace name 'JObject' could not be found (are you missing a using directive or an assembly reference?)". [Строка: 2; Cтолбец: 1]

Что не так? Почему не находит?
Попробуйте так
C#:
var obj = Global.ZennoLab.Json.Linq.JObject.Parse(jsonString);
 
  • Спасибо
Реакции: Iv1

Deisler

Client
Регистрация
26.10.2019
Сообщения
486
Благодарностей
191
Баллы
43
Ошибка в действии "CS0246" "The type or namespace name 'JObject' could not be found (are you missing a using directive or an assembly reference?)". [Строка: 2; Cтолбец: 1]

Что не так? Почему не находит?
Да, забыл в решении указать что нужно прописать
C#:
using Global.ZennoLab.Json.Linq;
в директивах Using
 
  • Спасибо
Реакции: Iv1

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