#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();
}