首页 > 解决方案 > 将此 JSON 转换为树并找到父级的路径

问题描述

data= {
"saturn": [
        "planet",
        "american_car",
        "car"
    ],
    "american_car": [
        "car",
        "gas_driven_automobile"
    ],
    "planet": [
        "large_object",
        "celestial_body"
    ],
    "large_object": [],
    "gas_driven_automobile": [
        "gas_powered_road_vehicle",
        "car"
    ],
    "car": [
        "vehicle",
        "motor_vehicle"
    ],
"vehicle": [],
"motor_vehicle": [],
"gas_powered_road_vehicle": [],
"celestial_body": []
};

我需要编写一个算法,如果我输入“土星”,我需要获得从土星到不同父母的所有可能路径。例如,

saturn ->planet ->large_object  
saturn ->american_car->car->vehicle
saturn ->american_car->car->motor_vehicle
saturn ->american_car->gas_driven_automobile->gas_powered_road_vehicle
saturn ->american_car->gas_driven_automobile->car->vehicle

以及所有其他可能的路径。

我正在考虑以某种方式将其转换为树,然后使用库来计算从子节点到父节点的路径。

正在编写算法,无法弄清楚如何开始将其转换为树。

标签: jsonpathtreeparent

解决方案


使用,您可以简单地定义一个递归函数:

def parents($key):
  if has($key)
  then if .[$key] == []  then [] else .[$key][] as $k | [$k] + parents($k) end
  else []
  end;

要使用它来产生“->”样式的输出,请使用 -r 命令行选项调用 jq,然后像这样调用上述函数:

["saturn"] + parents("saturn")
| join(" -> ")

更经济

def lineages($key):
  [$key] + (lineages(.[$key][]) // []);


lineages("saturn") | join(" -> ")

推荐阅读