簡體   English   中英

提取嵌套JSON對象的模式

[英]Extract schema of nested JSON object

我們假設這是源json文件:

{    
    "name": "tom",
    "age": 12,
    "visits": {
        "2017-01-25": 3,
        "2016-07-26": 4,
        "2016-01-24": 1
    }
}

我想得到:

[
  "age",
  "name",
  "visits.2017-01-25",
  "visits.2016-07-26",
  "visits.2016-01-24"
]

我可以使用: jq '. | keys' file.json提取密鑰jq '. | keys' file.json jq '. | keys' file.json jq '. | keys' file.json ,但這會跳過嵌套字段。 如何包括那些?

根據您的輸入,調用:

jq 'leaf_paths | join(".")'

生產:

"name"
"age"
"visits.2017-01-25"
"visits.2016-07-26"
"visits.2016-01-24"

如果要包含“訪問次數”,請使用paths 如果您希望將結果作為JSON數組,請使用方括號括起過濾器:[...]

如果您的輸入可能包含數組,那么除非您使用的是jq 1.6或更高版本,否則您需要將整數索引顯式轉換為字符串; 此外,由於現在不推薦使用leaf_paths ,您可能希望使用其def。 結果:

jq 'paths(scalars) | map(tostring) | join(".")'

allpaths

要包含null的路徑,可以使用allpaths定義的allpaths

def allpaths:
  def conditional_recurse(f):  def r: ., (select(.!=null) | f | r); r;
  path(conditional_recurse(.[]?)) | select(length > 0);

例:

{"a": null, "b": false} | allpaths | join(".")

生產:

"a"
"b"

all_leaf_paths

假設jq版本1.5或更高版本,我們可以通過遵循all_leaf_paths使用的策略來獲取all_leaf_paths ,即添加以下定義:

def allpaths(f):
  . as $in | allpaths | select(. as $p|$in|getpath($p)|f);

def isscalar:
  . == null or . == true or . == false or type == "number" or type == "string";

def all_leaf_paths: allpaths(isscalar);

例:

{"a": null, "b": false, "object":{"x":0} } | all_leaf_paths | join(".")

生產:

"a"
"b"
"object.x"

這樣做你想要的,但它不會返回數組中的數據,但它應該是一個簡單的修改:

https://github.com/ilyash/show-struct

你也可以看看這個頁面: https//ilya-sher.org/2016/05/11/most-jq-you-will-ever-need/

前段時間,我編寫了一個結構模式推理引擎,它生成了鏡像所考慮的JSON文檔的簡單結構模式,例如,對於此處給出的示例JSON,推斷的模式是:

{
  "name": "string",
  "age": "number",
  "visits": {
    "2017-01-25": "number",
    "2016-07-26": "number",
    "2016-01-24": "number"
  }
}

這不完全是原始發布中請求的格式,但對於大型對象集合,它確實提供了有用的概述。

更重要的是,現在有一個補充驗證器,用於檢查JSON文檔集合是否與結構模式匹配。 驗證器檢查用JESS (JSON擴展結構模式)編寫的模式, JESS擴展結構模式是模式推理引擎生成的簡單結構模式(SSS)的超集。

(我們的想法是,可以使用SSS作為起點來添加更復雜的約束,包括遞歸約束,文檔內參照完整性約束等)。

作為參考,以下是使用“schema”模塊生成sample.json的SSS的方法:

jq 'include "schema"; schema' source.json > source.schema.json

並針對SSS或ESS驗證source.json:

JESS --schema  source.schema.json  source.json

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM