我有两个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
},
]}
答案 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);
}
}
}