помогите правильно распарсить json средствами javascript (google apps script)
есть json содержащий что-то вроде
[
{
"contents": [
{
"amount": 40,
"type_id": 2389
},
{
"amount": 40,
"type_id": 2390
}
],
"last_cycle_start": "2024-03-06T23:34:32Z",
"latitude": 1.7929432392120361,
"longitude": 5.795536994934082,
"pin_id": 1044610962318,
"schematic_id": 67,
"type_id": 2480
},
{
"contents": [
{
"amount": 40,
"type_id": 2389
},
{
"amount": 40,
"type_id": 2390
}
],
"last_cycle_start": "2024-03-06T23:34:32Z",
"latitude": 1.7809253931045532,
"longitude": 5.796088695526123,
"pin_id": 1044610962322,
"schematic_id": 67,
"type_id": 2480
}
]
здесь два элемента, для примера достаточно
Собственно не получается получить все свойства используя метод JSON.parse, т.е. собственно, получается обойти элементы по индексу или иными способами. Получаю индексы и могу их вывести, а получить сами свойства не получается ни по индексу ни по ключу.
с более простым json-объектом, состоящим из одного элемента, все хорошо.
Прошу подсказать как правильно парсить такие и/или более сложные объекты json
функция:
function GetDataInJsonMixSimple_consumption(data_json,id_resource){
var DATA = JSON.parse(data_json, function(key, value){ return (value);}
);
quantity = 0;
for (let i=0;i<DATA.length; i++){
var objt = DATA[i];
type_id = objt.type_id;
//console.log("type_id",type_id);
if (type_id == 2480){
contents = objt.contents;
//console.log("contents",contents);
for (let j=0;j<contents.length; j++){
//console.log("content",contents[j]);
if (contents[j].type_id == id_resource) {
quantity += contents[j].amount;
}
}
}
}
console.log("quantity",quantity);
return quantity;
}
let consumption_quantity = GetDataInJsonMixSimple_consumption(data_json1, 2389);
Ответы (2 шт):
Автор решения: Armen
→ Ссылка
const json = [
{
contents: [
{
amount: 25,
type_id: 2389,
},
{
amount: 40,
type_id: 2390,
},
],
type_id: 2480,
},
{
contents: [
{
amount: 25,
type_id: 2389,
},
{
amount: 40,
type_id: 2390,
},
],
type_id: 2480,
},
{
type_id: 2481,
contents: [
{
amount: 25,
type_id: 2389,
},
{
amount: 40,
type_id: 2390,
},
],
},
];
//то что у тебя есть и так работает(просто чуток подчистил)
const getQuantity = (json, approvedInnerId) => {
const parsedJson = JSON.parse(json);
let quantity = 0;
for (let i = 0; i < parsedJson.length; i++) {
const { type_id, contents } = parsedJson[i];
if (type_id == 2480) {
for (let j = 0; j < contents.length; j++) {
const { type_id, amount } = contents[j];
if (type_id == approvedInnerId) {
quantity += amount;
}
}
}
}
return quantity;
};
//более быстрый вариант реализации
const getQuantityFaster = (json, approvedInnerId) => {
const APPROVED_ROOT_ID = 2480;
let quantity = 0;
let temporaryAmountForUpQuantity = 0;
let amount = 0;
JSON.parse(json, (key, value) => {
if (key === "amount") {
amount = value;
}
const isCorrectInnerId = key === "type_id" && value === approvedInnerId;
if (isCorrectInnerId) {
temporaryAmountForUpQuantity = amount;
}
const isCorrectRootId = value?.contents && value?.type_id === APPROVED_ROOT_ID;
if (isCorrectRootId) {
quantity += temporaryAmountForUpQuantity;
}
return value;
});
return quantity;
};
const quantity = getQuantity(JSON.stringify(json), 2389);
const quantity2 = getQuantityFaster(JSON.stringify(json), 2390);
console.log(quantity)
console.log(quantity2)
Автор решения: Antonio
→ Ссылка
Вот более читаемый вариант кода:
const stringify = (json) => {
return JSON.stringify(json, null, 2);
}
const getQuantity = (json, approvedInnerId) => {
const parsedJson = JSON.parse(stringify(json));
let quantity = 0;
parsedJson.forEach(item => {
if (item.type_id == 2480) {
item.contents.forEach(content => {
if (content.type_id == approvedInnerId) {
quantity += content.amount;
}
});
}
});
return quantity;
};
const x = () => {
console.log(getQuantity(json, 2390));
console.log(getQuantity(json, 2389));
}