jq:将特定键从一个对象提取到另一个

时间:2019-06-06 09:55:40

标签: json jq

我有两个JSON文件。

file1.json:

{
  "Fruits": [
  {
    "name": "Apple",
    "something_else": 123,
    "id": 652090
  },
  {
    "name": "Orange",
    "something_else": 456,
    "id": 28748
  }
]}

file2.json:

{
  "Fruits": [
  {
    "weight": 5,
    "id": 652090
  },
  {
    "weight": 7,
    "id": 28748
  }
]}

如果两个文件都有一个公用键“ id”,我想从两个文件中合并它们,但是只能从file1中提取“ name”属性。如何使用jq做到这一点?

这就是我想要得到的:

{
  "Fruits": [
  {
    "name": "Apple",
    "weight": 5,
    "id": 652090
  },
  {
    "name": "Orange",
    "weight": 7,
    "id": 28748
  },
]}

2 个答案:

答案 0 :(得分:1)

合并Fruits数组,按id进行分组,选择包含2个元素的组,因为我们希望在两个文件中都包含 fruits 。对于每个选定的组;将第一组元素中的name字段添加到第二,并以数组的形式收集结果。

jq -n '[inputs.Fruits[]]
| reduce (group_by(.id)[] | select(length==2)) as $f
  ([]; . + [$f[1] + ($f[0] | {name})])' file1.json file2.json

请注意,在命令行上给出订单文件很重要,带有name的文件应该在其他文件之前给出。


将具有相同id的对象合并并提取字段子集要容易得多:

jq -n '[inputs.Fruits[]]
| group_by(.id)
| map(select(length==2) | add | {name, id, weight})
' file1.json file2.json

答案 1 :(得分:1)

可以用很多方法来构造它。这是另一种方式:

 header("Content-Type: application/json");
    $result = ["result" => null];

    $request = file_get_contents("php://input");

    if(isset($request) && !empty($request)) {
        $requestObj = json_decode($request);
        if($requestObj->method == "getNames") {
            $input = $requestObj->input;
            if($input != "") {
                $sql = "SELECT ArtikelName FROM artikel WHERE ArtikelName LIKE ? LIMIT 5;"; 
                $statement = $conn -> prepare($sql); //prepare
                $statement -> execute(array("$input%")); 
                $result = $statement -> fetchall(PDO::FETCH_ASSOC);
                echo json_encode($result);

            }
        }
    }