简体   繁体   中英

find and extract object json from key value

I'm trying to extract a specific object from a json file, note the key, and then I would like to return new json. The problem is that my file is quite complicated. As backend i use expressjs

Sample.json

'[{"ServID":"Rai 1","Parametri":[{"Pid":"258","Text":"PMT"},{"Pid":"512","Text":"MPEG-2 Video (720x576i, @25 Hz, 16:9, 4:2:0)"},{"Pid":"576","Text":"Teletext (ita, Initial Teletext page)"},{"Pid":"650","Text":"MPEG-2 Audio (ita, Audio layer II, 192 kb/s, @48,000 Hz, stereo)"},{"Pid":"694","Text":"MPEG-2 Audio (Audio layer II, 64 kb/s, @48,000 Hz, single channel)"},{"Pid":"699","Text":"MPEG-2 Audio (eng)"},{"Pid":"2001","Text":"MPEG-2 Private sections (AIT)"},{"Pid":"2002","Text":"MPEG-2 Private sections (AIT)"},{"Pid":"3001","Text":"DSM-CC U-N (MHP Object Carousel)"},{"Pid":"3002","Text":"DSM-CC U-N (HbbTV)"},{"Pid":"3101","Text":"DSM-CC Stream Descriptors"}]},{"ServID":"Rai 2","Parametri":[{"Pid":"257","Text":"PMT"},{"Pid":"513","Text":"MPEG-2 Video (720x576i, @25 Hz, 16:9, 4:2:0)"},{"Pid":"577","Text":"Teletext (ita, Initial Teletext page)"},{"Pid":"651","Text":"MPEG-2 Audio (ita, Audio layer II, 192 kb/s, @48,000 Hz, stereo)"},{"Pid":"695","Text":"MPEG-2 Audio (Audio layer II, 64 kb/s, @48,000 Hz, single channel)"},{"Pid":"696","Text":"MPEG-2 Audio (eng, Audio layer II, 192 kb/s, @48,000 Hz, stereo)"},{"Pid":"2001","Text":"MPEG-2 Private sections (AIT)"},{"Pid":"2002","Text":"MPEG-2 Private sections (AIT)"},{"Pid":"3001","Text":"DSM-CC U-N (MHP Object Carousel)"},{"Pid":"3002","Text":"DSM-CC U-N (HbbTV)"},{"Pid":"3101","Text":"DSM-CC Stream Descriptors"}]},{"ServID":"Rai 3 TGR Sardegna","Parametri":[{"Pid":"256","Text":"PMT"},{"Pid":"514","Text":"MPEG-2 Video (720x576i, @25 Hz, 16:9, 4:2:0)"},{"Pid":"578","Text":"Teletext (ita, Initial Teletext page)"},{"Pid":"652","Text":"MPEG-2 Audio (ita, Audio layer II, 192 kb/s, @48,000 Hz, stereo)"},{"Pid":"697","Text":"MPEG-2 Audio (Oth, Audio layer II, 64 kb/s, @48,000 Hz, single channel)"},{"Pid":"2001","Text":"MPEG-2 Private sections (AIT)"},{"Pid":"2002","Text":"MPEG-2 Private sections (AIT)"},{"Pid":"3001","Text":"DSM-CC U-N (MHP Object Carousel)"},{"Pid":"3002","Text":"DSM-CC U-N (HbbTV)"},{"Pid":"3101","Text":"DSM-CC Stream Descriptors"}]},{"ServID":"Rai Radio1","Parametri":[{"Pid":"259","Text":"PMT"},{"Pid":"653","Text":"MPEG-2 Audio (ita, Audio layer II, 192 kb/s, @48,000 Hz, stereo)"},{"Pid":"2001","Text":"MPEG-2 Private sections (AIT)"},{"Pid":"2002","Text":"MPEG-2 Private sections (AIT)"},{"Pid":"3001","Text":"DSM-CC U-N (MHP Object Carousel)"},{"Pid":"3002","Text":"DSM-CC U-N (HbbTV)"},{"Pid":"3101","Text":"DSM-CC Stream Descriptors"}]},{"ServID":"Rai Radio2","Parametri":[{"Pid":"260","Text":"PMT"},{"Pid":"654","Text":"MPEG-2 Audio (Audio layer II, 192 kb/s, @48,000 Hz, stereo)"},{"Pid":"2001","Text":"MPEG-2 Private sections (AIT)"},{"Pid":"2002","Text":"MPEG-2 Private sections (AIT)"},{"Pid":"3001","Text":"DSM-CC U-N (MHP Object Carousel)"},{"Pid":"3002","Text":"DSM-CC U-N (HbbTV)"},{"Pid":"3101","Text":"DSM-CC Stream Descriptors"}]},{"ServID":"Rai Radio3","Parametri":[{"Pid":"261","Text":"PMT"},{"Pid":"655","Text":"MPEG-2 Audio (Audio layer II, 192 kb/s, @48,000 Hz, stereo)"},{"Pid":"2001","Text":"MPEG-2 Private sections (AIT)"},{"Pid":"2002","Text":"MPEG-2 Private sections (AIT)"},{"Pid":"3001","Text":"DSM-CC U-N (MHP Object Carousel)"},{"Pid":"3002","Text":"DSM-CC U-N (HbbTV)"},{"Pid":"3101","Text":"DSM-CC Stream Descriptors"}]},{"ServID":"Test HEVC main10","Parametri":[{"Pid":"300","Text":"PMT"},{"Pid":"500","Text":"HEVC video (1280x720, main 10 profile, level 5.1, 4:2:0)"}]},{"ServID":"Rai News 24","Parametri":[{"Pid":"280","Text":"PMT"},{"Pid":"520","Text":"MPEG-2 Video (720x576i, @25 Hz, 16:9, 4:2:0)"},{"Pid":"599","Text":"Teletext (ita, Initial Teletext page)"},{"Pid":"690","Text":"MPEG-2 Audio (ita, Audio layer II, 192 kb/s, @48,000 Hz, stereo)"},{"Pid":"2001","Text":"MPEG-2 Private sections (AIT)"},{"Pid":"2002","Text":"MPEG-2 Private sections (AIT)"},{"Pid":"3001","Text":"DSM-CC U-N (MHP Object Carousel)"},{"Pid":"3002","Text":"DSM-CC U-N (HbbTV)"},{"Pid":"3101","Text":"DSM-CC Stream Descriptors"}]}]'

Conceptually I would like something like this

if ("Pid" == "258" and "Text" === "PMT") {
return {"ServID":"Rai 1","Parametri":[{"Pid":"258","Text":"PMT"},{"Pid":"512","Text":"MPEG-2 Video (720x576i, @25 Hz, 16:9, 4:2:0)"},{"Pid":"576","Text":"Teletext (ita, Initial Teletext page)"},{"Pid":"650","Text":"MPEG-2 Audio (ita, Audio layer II, 192 kb/s, @48,000 Hz, stereo)"},{"Pid":"694","Text":"MPEG-2 Audio (Audio layer II, 64 kb/s, @48,000 Hz, single channel)"},{"Pid":"699","Text":"MPEG-2 Audio (eng)"},{"Pid":"2001","Text":"MPEG-2 Private sections (AIT)"},{"Pid":"2002","Text":"MPEG-2 Private sections (AIT)"},{"Pid":"3001","Text":"DSM-CC U-N (MHP Object Carousel)"},{"Pid":"3002","Text":"DSM-CC U-N (HbbTV)"},{"Pid":"3101","Text":"DSM-CC Stream Descriptors"}]}

Also a question, in these cases, is it preferable to do this work directly on the backend side (I use expressjs) or return the full json and search the pid with the browser?

I could probably start with something like this, or use.map() to iterate through Array Items?

 fs.readFile(file, (err, data) => {
    if (err) throw err;
    let found = data.find(e => e.Parametri.Pid === "258");
    res.json(JSON.parse(found));
});

Thanks

This combination of .filter() and .some() will do the job:

 const json='[{"ServID":"Rai 1","Parametri":[{"Pid":"258","Text":"PMT"},{"Pid":"512","Text":"MPEG-2 Video (720x576i, @25 Hz, 16:9, 4:2:0)"},{"Pid":"576","Text":"Teletext (ita, Initial Teletext page)"},{"Pid":"650","Text":"MPEG-2 Audio (ita, Audio layer II, 192 kb/s, @48,000 Hz, stereo)"},{"Pid":"694","Text":"MPEG-2 Audio (Audio layer II, 64 kb/s, @48,000 Hz, single channel)"},{"Pid":"699","Text":"MPEG-2 Audio (eng)"},{"Pid":"2001","Text":"MPEG-2 Private sections (AIT)"},{"Pid":"2002","Text":"MPEG-2 Private sections (AIT)"},{"Pid":"3001","Text":"DSM-CC UN (MHP Object Carousel)"},{"Pid":"3002","Text":"DSM-CC UN (HbbTV)"},{"Pid":"3101","Text":"DSM-CC Stream Descriptors"}]},{"ServID":"Rai 2","Parametri":[{"Pid":"257","Text":"PMT"},{"Pid":"513","Text":"MPEG-2 Video (720x576i, @25 Hz, 16:9, 4:2:0)"},{"Pid":"577","Text":"Teletext (ita, Initial Teletext page)"},{"Pid":"651","Text":"MPEG-2 Audio (ita, Audio layer II, 192 kb/s, @48,000 Hz, stereo)"},{"Pid":"695","Text":"MPEG-2 Audio (Audio layer II, 64 kb/s, @48,000 Hz, single channel)"},{"Pid":"696","Text":"MPEG-2 Audio (eng, Audio layer II, 192 kb/s, @48,000 Hz, stereo)"},{"Pid":"2001","Text":"MPEG-2 Private sections (AIT)"},{"Pid":"2002","Text":"MPEG-2 Private sections (AIT)"},{"Pid":"3001","Text":"DSM-CC UN (MHP Object Carousel)"},{"Pid":"3002","Text":"DSM-CC UN (HbbTV)"},{"Pid":"3101","Text":"DSM-CC Stream Descriptors"}]},{"ServID":"Rai 3 TGR Sardegna","Parametri":[{"Pid":"256","Text":"PMT"},{"Pid":"514","Text":"MPEG-2 Video (720x576i, @25 Hz, 16:9, 4:2:0)"},{"Pid":"578","Text":"Teletext (ita, Initial Teletext page)"},{"Pid":"652","Text":"MPEG-2 Audio (ita, Audio layer II, 192 kb/s, @48,000 Hz, stereo)"},{"Pid":"697","Text":"MPEG-2 Audio (Oth, Audio layer II, 64 kb/s, @48,000 Hz, single channel)"},{"Pid":"2001","Text":"MPEG-2 Private sections (AIT)"},{"Pid":"2002","Text":"MPEG-2 Private sections (AIT)"},{"Pid":"3001","Text":"DSM-CC UN (MHP Object Carousel)"},{"Pid":"3002","Text":"DSM-CC UN (HbbTV)"},{"Pid":"3101","Text":"DSM-CC Stream Descriptors"}]},{"ServID":"Rai Radio1","Parametri":[{"Pid":"259","Text":"PMT"},{"Pid":"653","Text":"MPEG-2 Audio (ita, Audio layer II, 192 kb/s, @48,000 Hz, stereo)"},{"Pid":"2001","Text":"MPEG-2 Private sections (AIT)"},{"Pid":"2002","Text":"MPEG-2 Private sections (AIT)"},{"Pid":"3001","Text":"DSM-CC UN (MHP Object Carousel)"},{"Pid":"3002","Text":"DSM-CC UN (HbbTV)"},{"Pid":"3101","Text":"DSM-CC Stream Descriptors"}]},{"ServID":"Rai Radio2","Parametri":[{"Pid":"260","Text":"PMT"},{"Pid":"654","Text":"MPEG-2 Audio (Audio layer II, 192 kb/s, @48,000 Hz, stereo)"},{"Pid":"2001","Text":"MPEG-2 Private sections (AIT)"},{"Pid":"2002","Text":"MPEG-2 Private sections (AIT)"},{"Pid":"3001","Text":"DSM-CC UN (MHP Object Carousel)"},{"Pid":"3002","Text":"DSM-CC UN (HbbTV)"},{"Pid":"3101","Text":"DSM-CC Stream Descriptors"}]},{"ServID":"Rai Radio3","Parametri":[{"Pid":"261","Text":"PMT"},{"Pid":"655","Text":"MPEG-2 Audio (Audio layer II, 192 kb/s, @48,000 Hz, stereo)"},{"Pid":"2001","Text":"MPEG-2 Private sections (AIT)"},{"Pid":"2002","Text":"MPEG-2 Private sections (AIT)"},{"Pid":"3001","Text":"DSM-CC UN (MHP Object Carousel)"},{"Pid":"3002","Text":"DSM-CC UN (HbbTV)"},{"Pid":"3101","Text":"DSM-CC Stream Descriptors"}]},{"ServID":"Test HEVC main10","Parametri":[{"Pid":"300","Text":"PMT"},{"Pid":"500","Text":"HEVC video (1280x720, main 10 profile, level 5.1, 4:2:0)"}]},{"ServID":"Rai News 24","Parametri":[{"Pid":"280","Text":"PMT"},{"Pid":"520","Text":"MPEG-2 Video (720x576i, @25 Hz, 16:9, 4:2:0)"},{"Pid":"599","Text":"Teletext (ita, Initial Teletext page)"},{"Pid":"690","Text":"MPEG-2 Audio (ita, Audio layer II, 192 kb/s, @48,000 Hz, stereo)"},{"Pid":"2001","Text":"MPEG-2 Private sections (AIT)"},{"Pid":"2002","Text":"MPEG-2 Private sections (AIT)"},{"Pid":"3001","Text":"DSM-CC UN (MHP Object Carousel)"},{"Pid":"3002","Text":"DSM-CC UN (HbbTV)"},{"Pid":"3101","Text":"DSM-CC Stream Descriptors"}]}]'; let pid=258, txt="PMT"; const res=JSON.parse(json).filter(ch=> ch.Parametri.some(e=> e.Pid==pid && e.Text===txt ) ); console.log(res);

res is still a JavaScript object here. If you need a JSON string, then simply do JSON.stringify(res) .

In reply to your extra question, whether to do this in the backend or the front-end:

If you can be certain that you will never need the filtered-out data anywhere then you should get rid of it as early as possible (ie in the backend). On the other hand - if your search requests change a lot - it might be favourable to send all information to the frontend once and then do a quick (local) filtering in the browser (without the need to get fresh data from the server each time).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM