【问题标题】:Extract a JS object as JSON将 JS 对象提取为 JSON
【发布时间】:2020-02-13 19:46:42
【问题描述】:

https://www.genenames.org/js/custom-downloads-bf.js

上面的 URL 包含一个这样的对象。

我想提取它以 JSON 格式打印到标准输出。谁能给我看完整的代码(在 python 或 nodejs 中)来实现这个目标?

        var i = {
            CHROMOSOMES: {
                HUMAN: [{
                    name: "1",
                    value: "1"
                }, {
                    name: "2",
                    value: "2"
                }, {
                    name: "3",
                    value: "3"
                }, {
                    name: "4",
                    value: "4"
                }, {
                    name: "5",
                    value: "5"
                }, {
                    name: "6",
                    value: "6"
                }, {
                    name: "7",
                    value: "7"
                }, {
                    name: "8",
                    value: "8"
                }, {
                    name: "9",
                    value: "9"
                }, {
                    name: "10",
                    value: "10"
                }, {
                    name: "11",
                    value: "11"
                }, {
                    name: "12",
                    value: "12"
                }, {
                    name: "13",
                    value: "13"
                }, {
                    name: "14",
                    value: "14"
                }, {
                    name: "15",
                    value: "15"
                }, {
                    name: "16",
                    value: "16"
                }, {
                    name: "17",
                    value: "17"
                }, {
                    name: "18",
                    value: "18"
                }, {
                    name: "19",
                    value: "19"
                }, {
                    name: "20",
                    value: "20"
                }, {
                    name: "21",
                    value: "21"
                }, {
                    name: "22",
                    value: "22"
                }, {
                    name: "X",
                    value: "X"
                }, {
                    name: "Y",
                    value: "Y"
                }, {
                    name: "reserved loci",
                    value: "reserved"
                }, {
                    name: "mitochondrial",
                    value: "mito"
                }, {
                    name: "pseudoautosomal",
                    value: "XandY"
                }]
            },
            STATUSES: [{
                name: "Approved",
                value: "Approved"
            }, {
                name: "Entry and symbol withdrawn",
                value: "Entry Withdrawn"
            }],
            ATTRIBUTES: {
                HGNC: [{
                    name: "HGNC ID",
                    value: "gd_hgnc_id"
                }, {
                    name: "Approved symbol",
                    value: "gd_app_sym"
                }, {
                    name: "Approved name",
                    value: "gd_app_name"
                }, {
                    name: "Status",
                    value: "gd_status"
                }, {
                    name: "Locus type",
                    value: "gd_locus_type"
                }, {
                    name: "Locus group",
                    value: "gd_locus_group"
                }, {
                    name: "Previous symbols",
                    value: "gd_prev_sym"
                }, {
                    name: "Previous name",
                    value: "gd_prev_name"
                }, {
                    name: "Synonyms",
                    value: "gd_aliases"
                }, {
                    name: "Name synonyms",
                    value: "gd_name_aliases"
                }, {
                    name: "Chromosome",
                    value: "gd_pub_chrom_map"
                }, {
                    name: "Date approved",
                    value: "gd_date2app_or_res"
                }, {
                    name: "Date modified",
                    value: "gd_date_mod"
                }, {
                    name: "Date symbol changed",
                    value: "gd_date_sym_change"
                }, {
                    name: "Date name changed",
                    value: "gd_date_name_change"
                }, {
                    name: "Accession numbers",
                    value: "gd_pub_acc_ids"
                }, {
                    name: "Enzyme IDs",
                    value: "gd_enz_ids"
                }, {
                    name: "NCBI Gene ID",
                    value: "gd_pub_eg_id"
                }, {
                    name: "Ensembl gene ID",
                    value: "gd_pub_ensembl_id"
                }, {
                    name: "Mouse genome database ID",
                    value: "gd_mgd_id"
                }, {
                    name: "Specialist database links",
                    value: "gd_other_ids"
                }, {
                    name: "Specialist database IDs",
                    value: "gd_other_ids_list"
                }, {
                    name: "Pubmed IDs",
                    value: "gd_pubmed_ids"
                }, {
                    name: "RefSeq IDs",
                    value: "gd_pub_refseq_ids"
                }, {
                    name: "Gene group ID",
                    value: "family.id"
                }, {
                    name: "Gene group name",
                    value: "family.name"
                }, {
                    name: "CCDS IDs",
                    value: "gd_ccds_ids"
                }, {
                    name: "Vega IDs",
                    value: "gd_vega_ids"
                }, {
                    name: "Locus specific databases",
                    value: "gd_lsdb_links"
                }],
                EXTERNAL: [{
                    name: "NCBI Gene ID",
                    source: "NCBI",
                    value: "md_eg_id"
                }, {
                    name: "OMIM ID",
                    source: "OMIM",
                    value: "md_mim_id"
                }, {
                    name: "RefSeq",
                    source: "NCBI",
                    value: "md_refseq_id"
                }, {
                    name: "UniProt ID",
                    source: "UniProt",
                    value: "md_prot_id"
                }, {
                    name: "Ensembl ID",
                    source: "Ensembl",
                    value: "md_ensembl_id"
                }, {
                    name: "Vega ID",
                    source: "Vega",
                    value: "md_vega_id"
                }, {
                    name: "UCSC ID",
                    source: "UCSC",
                    value: "md_ucsc_id"
                }, {
                    name: "Mouse genome database ID",
                    source: "MGI",
                    value: "md_mgd_id"
                }, {
                    name: "Rat genome database ID",
                    source: "RGD",
                    value: "md_rgd_id"
                }, {
                    name: "LNCipedia",
                    source: "LNCipedia",
                    value: "md_lncipedia"
                }, {
                    name: "GtRNAdb",
                    source: "GtRNAdb",
                    value: "md_gtrnadb"
                }]
            },
            ORDER_BY: [{
                name: "HGNC ID",
                value: "gd_hgnc_id"
            }, {
                name: "Approved symbol",
                value: "gd_app_sym_sort"
            }, {
                name: "Approved name",
                value: "gd_app_name"
            }, {
                name: "Status",
                value: "gd_status"
            }, {
                name: "Locus type",
                value: "gd_locus_type"
            }, {
                name: "Locus group",
                value: "gd_locus_group"
            }, {
                name: "Previous symbols",
                value: "gd_prev_sym"
            }, {
                name: "Previous name",
                value: "gd_prev_name"
            }, {
                name: "Synonyms",
                value: "gd_aliases"
            }, {
                name: "Name synonyms",
                value: "gd_name_aliases"
            }, {
                name: "Chromosome",
                value: "gd_pub_chrom_map_sort"
            }, {
                name: "Date approved",
                value: "gd_date2app_or_res"
            }, {
                name: "Date modified",
                value: "gd_date_mod"
            }, {
                name: "Date symbol changed",
                value: "gd_date_sym_change"
            }, {
                name: "Date name changed",
                value: "gd_date_name_change"
            }, {
                name: "Accession numbers",
                value: "gd_pub_acc_ids"
            }, {
                name: "Enzyme IDs",
                value: "gd_enz_ids"
            }, {
                name: "NCBI Gene ID",
                value: "gd_pub_eg_id"
            }, {
                name: "Ensembl gene ID",
                value: "gd_pub_ensembl_id"
            }, {
                name: "Mouse genome database ID",
                value: "gd_mgd_id"
            }, {
                name: "Specialist database links",
                value: "gd_other_ids"
            }, {
                name: "Specialist database IDs",
                value: "gd_other_ids_list"
            }, {
                name: "Pubmed IDs",
                value: "gd_pubmed_ids"
            }, {
                name: "RefSeq IDs",
                value: "gd_pub_refseq_ids"
            }, {
                name: "Gene group ID",
                value: "family.id"
            }, {
                name: "Gene group name",
                value: "family.name"
            }, {
                name: "CCDS IDs",
                value: "gd_ccds_ids"
            }, {
                name: "Vega IDs",
                value: "gd_vega_ids"
            }, {
                name: "Locus specific databases",
                value: "gd_lsdb_links"
            }, {
                name: "NCBI Gene ID (supplied by NCBI)",
                value: "md_eg_id"
            }, {
                name: "OMIM ID (supplied by OMIM)",
                value: "md_mim_id"
            }, {
                name: "RefSeq (supplied by NCBI)",
                value: "md_refseq_id"
            }, {
                name: "UniProt ID (supplied by UniProt)",
                value: "md_prot_id"
            }, {
                name: "Ensembl ID (supplied by Ensembl)",
                value: "md_ensembl_id"
            }, {
                name: "Vega ID (supplied by Vega)",
                value: "md_vega_id"
            }, {
                name: "UCSC ID (supplied by UCSC)",
                value: "md_ucsc_id"
            }, {
                name: "Mouse genome database ID (supplied by MGI)",
                value: "md_mgd_id"
            }, {
                name: "Rat genome database ID (supplied by RGD)",
                value: "md_rgd_id"
            }, {
                name: "LNCipedia ID (supplied by LNCipedia)",
                value: "md_lncipedia"
            }, {
                name: "GtRNAdb ID (supplied by GtRNAdb)",
                value: "md_gtrnadb"
            }],
            OUTPUT: ["Text", "Make URL for text"]
        };

【问题讨论】:

  • 唯一可靠的方法是实际执行该代码。如果您不信任来源,这可能会很危险。虽然我想你可以把它沙箱化......
  • 如何沙箱?有没有办法在 nodejs 程序中创建一个沙箱来运行代码?
  • 是的,有几个模块可以做到这一点。这是一个:npmjs.com/package/v8-sandbox
  • 您介意制作一个适用于输入 custom-downloads-bf.js 文件的脚本吗?

标签: javascript python node.js json regex


【解决方案1】:

我可能会美化 .js(例如使用 https://jsonformatter.org/jsbeautifier):

然后运行它:

sed -n $'/^[ \t]*CHROMOSOMES/,/^[ \t]*};/p' |
  sed -e '1s/^/{/' -e '$s/;//'

【讨论】:

    【解决方案2】:

    您可以尝试使用正则表达式来获取实际的 JavaScript 对象。但是,正如 cmets 中所述,您需要先执行代码,这可能很危险。

    // NodeJS
    const request = require("request");
    
    request("https://www.genenames.org/js/custom-downloads-bf.js",(error,body,response)=>{
      const MatchedResponse = body.match(/{C.*?};/gm)[0]; //Match the Object from "{C" to "};"
      let JSONResponse;
      eval("JSONResponse = " + MatchedResponse)
      console.log(JSON.stringify(JSONResponse));
    });
    

    如果您担心恶意代码被嵌入到对象中,您应该在执行之前创建一个函数来验证代码。

    【讨论】:

    • 但是这个正则表达式似乎不是很可靠。如果从“{C”到“}”还有其他对象怎么办?
    猜你喜欢
    • 2015-08-19
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 2016-02-02
    • 2010-10-30
    相关资源
    最近更新 更多