@debrovski said in Парсинг JSON:
Создаю цикл для перебора (Вот тут я не уверен что сделал правильно..)
В "Foreach" нужно указать массив для перебора, а не логическое выражение. По 1 и 2 пунктам не могу сказать без данных
Всем добрый день, есть код -
{"list":[{"id":444,"requests":[{"name":"222","amount":1}],"note":null,"botRequestBy":null,"nonlistSong":null,"donationAmount":1,"createdAt":"2020-02-02T18:27:28.762Z","prevId":null,"song":{"title":"555","artist":"","createdAt":"2019-02-05T23:05:23.000Z","attributeIds":[]},"songId":222,"streamerId":999,"position":1}
через запятую все идет тоже самое, но без листа {"id":445,"requests": и тд.
Требуется по названию песни "title":"555" - получить целиком строку
{"id":444,"requests":[{"name":"222","amount":1}],"note":null,"botRequestBy":null,"nonlistSong":null,"donationAmount":1,"createdAt":"2020-02-02T18:27:28.762Z","prevId":null,"song":{"title":"555","artist":"","createdAt":"2019-02-05T23:05:23.000Z","attributeIds":[]},"songId":222,"streamerId":999,"position":1}
После чего добавить в ней значение - {"name":"2","amount":2} на выходе мы получаем:
{"id":444,"requests":[{"name":"222","amount":1},{"name":"2","amount":2}],"note":null,"botRequestBy":null,"nonlistSong":null,"donationAmount":1,"createdAt":"2020-02-02T18:27:28.762Z","prevId":null,"song":{"title":"555","artist":"","createdAt":"2019-02-05T23:05:23.000Z","attributeIds":[]},"songId":222,"streamerId":999,"position":1}
Заранее большое спасибо.
Сделал на JS, но BAS такие извращения не кушает, к сожалению.
Реализация на JS:
let func_search = function(jsonstr, title_song) {
let obj = JSON.parse(jsonstr);
let result;
obj.list.forEach(function(item, i, arr) {
if (item.song.title == title_song) {
item.requests.push({"name":"Alex","amount":1});
//console.log(item.requests);
result = item;
}
});
return result;
};
let result = func_search(jsonstr, "555");
Пытался разобраться с JSonPath, но что-то у меня сложилось впечатление, что ни для чего кроме парсинга он не подойдет.
@lcatlas said in Json целиком с добавлением значения:
Всем добрый день, есть код - {"list":[{"id":444,"requests":[{"name":"222","amount":1}],"note":null,"botRequestBy":null,"nonlistSong":null,"donationAmount":1,"createdAt":"2020-02-02T18:27:28.762Z","prevId":null,"song":{"title":"555","artist":"","createdAt":"2019-02-05T23:05:23.000Z","attributeIds":[]},"songId":222,"streamerId":999,"position":1}, через запятую все идет тоже самое, но без листа {"id":445,"requests": и тд.
Требуется по названию песни "title":"555" - получить целиком строку {"id":444,"requests":[{"name":"222","amount":1}],"note":null,"botRequestBy":null,"nonlistSong":null,"donationAmount":1,"createdAt":"2020-02-02T18:27:28.762Z","prevId":null,"song":{"title":"555","artist":"","createdAt":"2019-02-05T23:05:23.000Z","attributeIds":[]},"songId":222,"streamerId":999,"position":1}
После чего добавить в ней значение - {"name":"2","amount":2} на выходе мы получаем:
{"id":444,"requests":[{"name":"222","amount":1},{"name":"2","amount":2}],"note":null,"botRequestBy":null,"nonlistSong":null,"donationAmount":1,"createdAt":"2020-02-02T18:27:28.762Z","prevId":null,"song":{"title":"555","artist":"","createdAt":"2019-02-05T23:05:23.000Z","attributeIds":[]},"songId":222,"streamerId":999,"position":1}Заранее большое спасибо.
Сделал на JS, но BAS такие извращения не кушает, к сожалению.
Реализация на JS:
let func_search = function(jsonstr, title_song) {
let obj = JSON.parse(jsonstr);
let result;
obj.list.forEach(function(item, i, arr) {
if (item.song.title == title_song) {
item.requests.push({"name":"Alex","amount":1});
//console.log(item.requests);
result = item;
}});
return result;
};
let result = func_search(jsonstr, "555");Пытался разобраться с JSonPath, но что-то у меня сложилось впечатление, что ни для чего кроме парсинга он не подойдет.
вы бы код обрамляли соответствующим образом

а то форум может съесть часть символов посчитав их оформлением текста
@lcatlas said in Json целиком с добавлением значения:
Всем добрый день, есть код -
json строка не полная
Сделал на JS, но BAS такие извращения не кушает, к сожалению.
замените let на var и будет работать
@lcatlas said in Json целиком с добавлением значения:
Да, прошу прощения, там очень много значений просто. Сейчас конец вставлю.
С вар - спасибо большое, сейчас поэксперементирую.
Только что проверил, всё работает
[[JSON]] = '{"list":[{"id":444,"requests":[{"name":"222","amount":1}],"note":null,"botRequestBy":null,"nonlistSong":null,"donationAmount":1,"createdAt":"2020-02-02T18:27:28.762Z","prevId":null,"song":{"title":"555","artist":"","createdAt":"2019-02-05T23:05:23.000Z","attributeIds":[]},"songId":222,"streamerId":999,"position":1}]}'
var func_search = function(jsonstr, title_song) {
var obj = JSON.parse(jsonstr);
obj.list.forEach(function(item) {
if (item.song.title == title_song) {
item.requests.push({"name":"Alex","amount":1});
}
});
return JSON.stringify(obj)
};
log([[JSON]])
[[RESULT]] = func_search([[JSON]], "555");
log([[RESULT]])
тестовый скрипт
Не совсем понятно, зачем вы из функции возвращаете объект найденного в массиве по условию названия песни. Я решил для наглядности вернуть весь изменённый json
@lcatlas said in Json целиком с добавлением значения:
Он мне требуется для возврата post-ом после изменения обратно на сервер.
В таком случае я бы сделал проще:
[[JSON]] = '{"list":[{"id":444,"requests":[{"name":"222","amount":1}],"note":null,"botRequestBy":null,"nonlistSong":null,"donationAmount":1,"createdAt":"2020-02-02T18:27:28.762Z","prevId":null,"song":{"title":"555","artist":"","createdAt":"2019-02-05T23:05:23.000Z","attributeIds":[]},"songId":222,"streamerId":999,"position":1}]}'
var title = "555"
var obj = JSON.parse([[JSON]])["list"].filter(function(c){return c.song.title == title})[0]
obj.requests.push({"name":"Alex","amount":1})
[[RESULT]] = JSON.stringify(obj)
log([[JSON]])
log([[RESULT]])
тестовый скрипт
@lcatlas said in Json целиком с добавлением значения:
Эх, все таки лист в начале нужен ))
{"list": [ и закрывающая }
Дак добавьте, 5 символов кода всего:
[[JSON]] = '{"list":[{"id":444,"requests":[{"name":"222","amount":1}],"note":null,"botRequestBy":null,"nonlistSong":null,"donationAmount":1,"createdAt":"2020-02-02T18:27:28.762Z","prevId":null,"song":{"title":"555","artist":"","createdAt":"2019-02-05T23:05:23.000Z","attributeIds":[]},"songId":222,"streamerId":999,"position":1}]}'
var title = "555"
var obj = JSON.parse([[JSON]])["list"].filter(function(c){return c.song.title == title})[0]
obj.requests.push({"name":"Alex","amount":1})
[[RESULT]] = JSON.stringify({"list":[obj]})
log([[JSON]])
log([[RESULT]])
@Fox said in Json целиком с добавлением значения:
JSON.stringify({"list":[obj]})
Прошу прощения, голова уже не варит совсем. На выходе у меня получается }]}
Надо }}, с этим и получилась заминка, к сожалению.
А квадратные скобки после [{"name":"222","amount":1}]
@lcatlas said in Json целиком с добавлением значения:
@Fox said in Json целиком с добавлением значения:
JSON.stringify({"list":[obj]})
Прошу прощения, голова уже не варит совсем. На выходе у меня получается }]}
Надо }}, с этим и получилась заминка, к сожалению.
Я вас не понимаю. Json строку я указал валидную, объект с свойством list и значением - массивом объектов. О каких фигурных скобках вы говорите?
{"list":[{"id":444,"requests":[{"name":"222","amount":1}],"note":null,"botRequestBy":null,"nonlistSong":null,"donationAmount":1,"createdAt":"2020-02-02T18:27:28.762Z","prevId":null,"song":{"title":"555","artist":"","createdAt":"2019-02-05T23:05:23.000Z","attributeIds":[]},"songId":222,"streamerId":999,"position":1}}
Это мой косяк. Вот оригинал строки.
На выходе у меня получается по коду }]} в конце и теряются [{"name":"222","amount":1} - здесь.
Оригинал [{"name":"222","amount":1}]
И в конце }}
@lcatlas said in Json целиком с добавлением значения:
{"list":[{"id":444,"requests":[{"name":"222","amount":1}],"note":null,"botRequestBy":null,"nonlistSong":null,"donationAmount":1,"createdAt":"2020-02-02T18:27:28.762Z","prevId":null,"song":{"title":"555","artist":"","createdAt":"2019-02-05T23:05:23.000Z","attributeIds":[]},"songId":222,"streamerId":999,"position":1}}Это мой косяк. Вот оригинал строки.
На выходе у меня получается по коду }]} в конце и теряются [{"name":"222","amount":1} - здесь.
Оригинал строки является невалидной json строкой, проверьте на https://jsoneditoronline.org/
{
"list": [
{
"id": 0,
"requests": [
{
"amount": 5,
"name": "some-user"
}
],
"note": "string",
"botRequestBy": "string",
"nonlistSong": "string",
"donationAmount": 0,
"createdAt": "string",
"song": {
"title": "string",
"artist": "string"
},
"songId": 0,
"streamerId": 0,
"position": 0
}
],
"status": {
"songsPlayedToday": 0
},
"previousPosition": 0,
"queue": {
"id": 0,
"requests": [
{
"amount": 5,
"name": "some-user"
}
],
"note": "string",
"botRequestBy": "string",
"nonlistSong": "string",
"donationAmount": 0,
"createdAt": "string",
"song": {
"title": "string",
"artist": "string"
},
"songId": 0,
"streamerId": 0,
"position": 0
}
}
Вот так оно у него приходит. Но видимо мне все равно придется пытать разработчика, так как по его методу оно не обновляется, даже если я ставлю, как у него в апи.
В общем спасибо большое, не разберешься так.
@lcatlas said in Json целиком с добавлением значения:
Вот так оно у него приходит.
Вот это валидный json
https://jsoneditoronline.org/?id=f077b358dde64dd18d3a765b45353790
@lcatlas said in Json целиком с добавлением значения:
А где я облажался при сборке? ) Но в целом, оно мне приходит в таком виде по get. Вопрос только как в конце должно быть наверно.
Да беда еще и в том, что урл куда я отдавать должен - 404.
я изначально сделал пример, где беру исходную строку, добавляю параметры и возвращаю всю строку, изменённую. Вы же брали только кусок, скорее всего косяк в этом. А вообще, надо читать мануал по api