简体   繁体   English

从键值中查找并提取对象json

[英]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.我正在尝试从 json 文件中提取特定对象,记下密钥,然后我想返回新的 json。 The problem is that my file is quite complicated.问题是我的文件很复杂。 As backend i use expressjs作为后端,我使用 expressjs

Sample.json示例.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?还有一个问题,在这些情况下,是直接在后端进行这项工作(我使用 expressjs)还是返回完整的 json 并使用浏览器搜索 pid?

I could probably start with something like this, or use.map() to iterate through Array Items?我可能可以从这样的开始,或者使用.map() 来遍历数组项?

 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: .filter().some()这种组合将完成这项工作:

 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. res在这里仍然是一个 JavaScript 对象。 If you need a JSON string, then simply do JSON.stringify(res) .如果您需要一个 JSON 字符串,那么只需执行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).另一方面 - 如果您的搜索请求变化很大 - 将所有信息发送到前端一次然后在浏览器中进行快速(本地)过滤(无需每次都从服务器获取新数据)可能是有利的)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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