Jquery 从嵌套的对象数组中获取数据

Jquery 从嵌套的对象数组中获取数据,jquery,arrays,json,bash,dictionary,Jquery,Arrays,Json,Bash,Dictionary,我试图解析JSON文件,以从同一文件中的字典中获取特定的值和.items[]名称 Source.json文件: { “名称”:“ABC公司”, “资产库”:[{ “名称”:“从API添加的资产”, “类型”:“访问部分”, “资产库”:[{ “名称”:“数据库A”, “资产编号”:1, “项目”:[“0ABC-001”、“0ABC-003”、“0ABC-004”] }, { “名称”:“数据库B”, “资产编号”:2, “项目”:[“0ABC-001”] }, { “名称”:“数据库C”, “资

我试图解析JSON文件,以从同一文件中的字典中获取特定的值和.items[]名称

Source.json文件:

{
“名称”:“ABC公司”,
“资产库”:[{
“名称”:“从API添加的资产”,
“类型”:“访问部分”,
“资产库”:[{
“名称”:“数据库A”,
“资产编号”:1,
“项目”:[“0ABC-001”、“0ABC-003”、“0ABC-004”]
}, {
“名称”:“数据库B”,
“资产编号”:2,
“项目”:[“0ABC-001”]
}, {
“名称”:“数据库C”,
“资产编号”:3,
“项目”:[“0ABC-002”、“0ABC-003”]
}]
}],
“对象字典”:[{
“uid”:“0ABC-001”,
“名称”:“群集A”
}, {
“uid”:“0ABC-002”,
“名称”:“集群B”
}, {
“uid”:“0ABC-003”,
“名称”:“Unit-001”
}, {
“uid”:“0ABC-004”,
“名称”:“机组-002”
}]
}
预期产出:

"Database A","Cluster A";"Unit-001";"Unit-002"
"Database B","Cluster A"
"Database C","Cluster B";"Unit-001"
我查看过类似的线程,并在jqplay上随机测试过,但无法获得输出。

使用jq(),您可以轻松解析.json文件

这里有一个非常接近您的解决方案:

$ jq -r '.assetbase[].assetbase[] | .name' test.json |
    while read name; do echo -ne "\"$name\"," ;
      jq -r --arg name "$name" '.assetbase[].assetbase[] |
      select (.name | contains($name)) | .items[]' test.json |
      while read uid; do
        jq -r --arg uid $uid '."objects-dictionary"[] |
        select (.uid | contains($uid)) | .name' test.json |
        while read oname; do echo -ne "\"$oname\";" ; done;
      done; echo -ne "\n" ;
    done

"Database A","Cluster A";"Unit-001";"Unit-002";
"Database B","Cluster A";
"Database C","Cluster B";"Unit-001";
您可以通过通用软件包管理器轻松安装:
sudo-yum-install-y-jq
用于基于RPM的发行版(如RedHat),或者
sudo-apt-get-install-y-jq
用于基于Debian的发行版(如Ubuntu等)

这不是bash解决方案,而是JS解决方案

下面的代码段创建了一个以数据库名称为键的对象(请查看控制台):

const数据={
“名称”:“ABC公司”,
“资产库”:[{
“名称”:“从API添加的资产”,
“类型”:“访问部分”,
“资产库”:[{
“名称”:“数据库A”,
“资产编号”:1,
“项目”:[“0ABC-001”、“0ABC-003”、“0ABC-004”]
}, {
“名称”:“数据库B”,
“资产编号”:2,
“项目”:[“0ABC-001”]
}, {
“名称”:“数据库C”,
“资产编号”:3,
“项目”:[“0ABC-002”、“0ABC-003”]
}]
}],
“对象字典”:[{
“uid”:“0ABC-001”,
“名称”:“群集A”
}, {
“uid”:“0ABC-002”,
“名称”:“集群B”
}, {
“uid”:“0ABC-003”,
“名称”:“Unit-001”
}, {
“uid”:“0ABC-004”,
“名称”:“机组-002”
}]
}
常量映射资产=(资产库、字典)=>{
const ret=资产基础减少((a,c)=>{
如果(c.name的类型)==“未定义”)a[c.name]=[]
a[c.name].push(c.name)
c、 items.forEach(e=>{
常数{
名称
}=字典。查找(el=>{
返回el.uid==e
})
a[c.name].push(name)
})
归还
}, {})
回程网
}
const mapped=mapAssets(data.assetbase[0]。assetbase,数据[“对象字典”])

console.log('mapped:',mapped)
Pure
jq
解决方案:

jq -r '([(."objects-dictionary"[] | {key:.uid, value:.name})] | from_entries
       ) as $obj
       | .assetbase[] | .assetbase[]
       | [.name, (.items[] as $i | $obj[$i])]
       | @csv' < file.json
jq-r'([(“对象字典”[]|{key:.uid,value:.name})]|来自_条目
)作为$obj
|.assetbase[]|.assetbase[]
|[.name,(.items[]作为$i |$obj[$i])]
|@csv'

它只使用逗号,不使用分号,但我担心jq无法做到这一点。

首先,请将您为解决此问题而编写的代码添加到问题中,以便我们可以帮助您调试它。第二,预期的输出不是有效的数据结构。简洁而漂亮的解决方案,谢谢分享。