我正在使用 scriptcontrol/jscript 在 VBA 中解析一个重度嵌套的 JSON。生成的 JSON 对象是超级嵌套的,并且具有重复出现的“无用”级别/层,称为“桶”。
有没有办法可以从我的 json 字符串或解析的 json 对象中共同删除这些?
想象它是这样的:
response.0.buckets.0.aggregations.0.10.buckets.0.5.buckets.0.9.buckets.0.20.buckets.0.8.buckets.0.13.buckets.0.14.buckets.0.15.buckets.0.16.buckets.0.19.buckets。 0.18.buckets.0.21.doc_count_error_upper_bound
我只需要 'doc_count_error_upper_bound' 值,并且基本上可以不用所有的 0 和没有所有的桶,使其嵌套更少:
response.aggregations.10.5.9.20.8.13.14.15.16.19.18.21.doc_count_error_upper_bound
这仍然是非常严重的嵌套,但已经为我省去了很多麻烦。我只是不知道如何在 VBA (es3) 中使用 jscript/scriptcontrol 来做到这一点。
源数据来自 Kibana 仪表板(http://demo.elastic.co/上的示例)
谢谢你的帮助!
碧玉
更新: 关于 VBA 代码的问题 - 我拥有的 VBA 代码无关紧要,因为它是通过 scriptcontrol 将 json 字符串加载到对象中的标准方式。
我不使用 EVAL,但出于示例目的,它将类似于以下内容:
Dim Scr as Object, Json as Object
Set Scr = CreateObject("Scriptcontrol")
Scr.Language = "Jscript"
Set Json = Scr.Eval("(" & WinHTTP.ResponseText & ")")
我无法分享 JSON 字符串的示例,因为它包含敏感数据。但最终,这不是问题所在。考虑示例https://adobe.github.io/Spry/data/json/donuts.js
在顶部,“击球手”是“击球手”和不同 ID 之间的关键。如果我想删除该密钥,但保留底层 ID 数据 - 我将如何通过在 VBA 中的 scriptcontrol 中工作的 js 脚本来做到这一点?
更新:
omegastripes 回答效果很好,但是,我没有意识到我想删除的一些键(“桶”和“0”等)在它们下面有键和值。
让我们以甜甜圈为例,只是稍作改动 - 请参见此处: https ://pastebin.com/WxYir7vK
现在我想删除“0”、“1”、“2”等键而不会丢失底层子键。但是,要使 omegastripes 代码正常工作,我必须从所有层/整个 json 中删除键 'sequence'、'variant'、'name' 和 'ppu'。
我可以为其中一个执行此操作,对于具有以下功能的一层:
function unseat(obj, prop) { for(var k in obj[prop]) obj[k] = obj[prop][k]; delete obj[prop]; return obj; }
然后调用函数'unseat(JSONObj,“variant”)' - 这有效,但一次仅适用于四个变量之一并且仅适用于一层。我怎样才能改变它,以便我可以在整个对象中删除它,一次全部四个,以便之后我可以使用 omegastripes 代码展开。
摘要
1)我采用这个 json 字符串:https ://pastebin.com/WxYir7vK
2)将其解析为脚本控件到 VBA
3)循环遍历它并删除所有“序列”、“变体”、“名称”和“ppu”键/值对
4) 通过 omegastripes 代码打开它。
步骤 1 / 2 和 4 已处理 - 但如何做 3?
谢谢!