У меня возникла следующая проблема:
Мне нужно перебрать большой объект Json (дочерние узлы состоят из массивов, строк и объектов с глубиной не менее 4-5 уровней с точки зрения вложенных свойств).
В некоторых частях большого файла Json есть определенная структура объекта, у него есть свойство с именем "erpCode".Мне нужно отсканировать Json и найти все объекты с этим свойством, взять значение, использовать этот код, чтобы запросить подробности у другого API, и как только я получу детали, вставить их в объект с текущим erpCode.
Просто чтобы уточнить, в моем случае имя свойства родительского узла в Json всегда равно значению в поле 'typeSysname', которое находится на том же уровне, что и свойство erpCode.Простой пример:
{
"cars": [
{
"name": "X222",
"carType": {
"erpCode": "skoda",
"value": null,
"typeSysName": "carType"
}
}
],
"model": {
"year": 1999,
"details": {
"erpCode": "112"
"value": null,
"typeSysName": "details"
}
}
}
В этом примере мне нужно найти 2 свойства, получить значения skoda и 112 из них, получить значения и данные описания из другого API и установить их в этот Json вправильное местоположение.
PS Есть ли шанс, что есть хороший пакет npm, который может помочь мне в этом?
Редактировать: я получил решение на C # несколько месяцев назад, которое работает в общем видена Json и обрабатывает сложность структуры в общем виде.Но теперь мне нужно преобразовать это в Javascript, и я немного растерялся.
public static string TranslateDocErpCodes(string jsonString, string topRetailerSysName)
{
try
{
var doc = JObject.Parse(jsonString);
var erpCodeList = doc.SelectTokens("$..erpCode").ToList();
foreach (var erpCodeJToken in erpCodeList)
{
var value = erpCodeJToken?.Value<string>();
var erpCodeParent = erpCodeJToken?.Parent.Parent;
var erpCodeProperty = erpCodeParent?.Path.Split(".").Last();
var result =
_dataService.GetLovFromErpCode(topRetailerSysName, erpCodeProperty, value);
if (result == null)//reset lov obj
{
if (erpCodeParent?.Parent is JProperty prop)
prop.Value = JObject.FromObject(new LovObject { ErpCode = value });
}
else//set lov obj
{
result.ErpCode = value;
if (erpCodeParent?.Parent is JProperty prop)
prop.Value = JObject.FromObject(result);
}
}
return JsonConvert.SerializeObject(doc);
}
catch (Exception e)
{
throw new Exception("ErpConvert.TranslateDocErpCodes() : " + e);
}
}