Удалить все вхождения определенного ключа из ответа JSON в C#

#c# #json #jobjectformatter

#c# #json #json.net

Вопрос:

У меня есть строка JSON, из которой я хочу исключить все вхождения данного ключа.

JSON У меня есть:

 string requstBody =       
{
              "payLoad": [
                {
                  "BaseVersionId_": 9,
                  "VersionId_": 10,              
                  "AssetCollateralLink": [
                    {
                      "AssetId": 137,
                      "BaseVersionId_": 9,
                      "VersionId_": 10
                    },
                    {
                      "AssetId": 136,
                      "BaseVersionId_": 0,
                      "VersionId_": 1
                    }
                  ],
                  "CollateralProvider": [],
                  "AdvCollateralAllocation": [
                    {
                      "LinkId": 91,
                      "IsDeleted_": false,
                      "BaseVersionId_": 1,
                      "VersionId_": 2
                    }
                  ]
                }
              ]
            }
  

Я хочу исключить ключи «BaseVersionID_» и «VersionId_» следующим образом:

   string requstBody =  
{
              "payLoad": [
                {
                  "AssetCollateralLink": [
                    {
                      "AssetId": 137
                    },
                    {
                      "AssetId": 136
                    }
                  ],
                  "CollateralProvider": [],
                  "AdvCollateralAllocation": [
                    {
                      "LinkId": 91,
                      "IsDeleted_": false
                    }
                  ]
                }
              ]
            }
  

Я использовал JObject.Remove(); следующим образом

 JObject sampleObj1 = new JObject();
sampleObj1 = JsonHelper.JsonParse(requestBody);
sampleObj1.Remove("BaseVersionId_");
  

но можно удалить ключи только из иерархии полезной нагрузки.
Как мне удалить все вхождения ключа.

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

1. Предоставленная вами полезная нагрузка Json имеет неправильный формат. Укажите правильный ключ в соответствии с Json

2. @Sh.Imran Исправлено. Спасибо

3. Поскольку JObject является IEnumerable, вы можете использовать foreach хотя sampleObj1 и удалить ?

Ответ №1:

Требуемые свойства могут быть удалены из Json , просто с помощью Linq:

 var jsonObj = JObject.Parse(requestBody);
jsonObj.SelectToken("payLoad[0]").SelectToken("AdvCollateralAllocation")
                .Select(jt => (JObject)jt)
                .ToList()
                .ForEach(r =>
                    r
                    .Properties()
                    .ToList()
                    .ForEach(e =>
                    {
                        if (e.Name == "BaseVersionId_" || e.Name == "VersionId_")
                            e.Remove();
                    }));
  

Результирующий результат jsonObj будет без BaseVersionId_ и VersionId_ имен, а также их значений.

Ответ №2:

Я бы использовал JSONPath как таковой:

 var toRemove =  jsonObject
                .SelectTokens("$.payLoad.[*].AssetCollateralLink.[*]..BaseVersionId_")
                .Concat(stuff.SelectTokens("$.payLoad.[*].AssetCollateralLink.[*]..VersionId_"))
                .Concat(stuff.SelectTokens("$.payLoad.[*].AdvCollateralAllocation.[*]..VersionId_"))
                .Concat(stuff.SelectTokens("$.payLoad.[*].AdvCollateralAllocation.[*]..BaseVersionId_"))
                .ToList();

for (int i = toRemove.Count - 1; i >= 0; i--)
{
    toRemove[i].Parent?.Remove();
}