嵌套的 json 字符串和 php 中的变量

Nested json string with variables in php

我不会骗你们的:我讨厌嵌套数组。

所以下面是我的[工作]代码

$query_array = Array(
    "fields" => Array ("timestamp", "user.raw", "mailbox", "verb", "backend"),
    "size"   => 1,
    "sort"   => Array (Array ("@timestamp" => Array ("order" => $varOrder))),
    "query"  => Array (
        "bool" => Array (
            "must" => Array (
                Array ("match" => Array ("verb"    => "open")),
                Array ("term"  => Array ($varField => $varValue))
            )
        )
    )
);

我想使用下面的[无效]代码

$query_json_string = '{
    "fields" : [ "timestamp", "user.raw", "mailbox", "verb", "backend" ],
    "size"   : 1,
    "sort"   : [ { "@timestamp" : { "order" : $varOrder } } ],
    "query"  : {
        "bool": {
            "must": [
                { "match" : { "verb"    : "open" } },
                { "term"  : { $varField : $varValue } }
            ]
        }
    }
}';

维护起来容易多了...

但在单引号内,变量 varOrdervarFieldvarValue 永远不会展开(我相信)。

如何在这个漂亮干净的 json 字符串中使用变量?

您可以将单引号切换为双引号并转义双引号

$query_json_string = "{
    \"fields\" : [ \"timestamp\", \"user.raw\", \"mailbox\", \"verb\",     \"backend\" ],
    \"size\"   : 1,
    \"sort\"   : [ { \"@timestamp\" : { \"order\" : $varOrder } } ],
    \"query\"  : {
        \"bool\": {
            \"must\": [
                { \"match\" : { \"verb\"    : \"open\" } },
                { \"term\"  : { $varField : $varValue } }
            ]
        }
    }
}";

JSON 基本上是 Javascript 版本的关联数组。

$query_array = Array(
    "fields" => Array ("timestamp", "user.raw", "mailbox", "verb", "backend"),
    "size"   => 1,
    "sort"   => Array (Array ("@timestamp" => Array ("order" => $varOrder))),
    "query"  => Array (
        "bool" => Array (
            "must" => Array (
                Array ("match" => Array ("verb"    => "open")),
                Array ("term"  => Array ($varField => $varValue))
            )
        )
    )
);

$query_json_string = json_encode($query_array);

但是如果您对此有疑问,heredoc 语法应该适合您..

$query_json_string = <<<JSON
{
    "fields" : [ "timestamp", "user.raw", "mailbox", "verb", "backend" ],
    "size"   : 1,
    "sort"   : [ { "@timestamp" : { "order" : $varOrder } } ],
    "query"  : {
        "bool": {
            "must": [
                { "match" : { "verb"    : "open" } },
                { "term"  : { $varField : $varValue } }
            ]
        }
    }
}
JSON;

// if you wanted PHP array,
$query_array = json_decode($query_json_string, true);

据我了解你的问题,你只是不满意 php 的数组语法。如果是这种情况,则不要使用 old 语法。而是使用简单的方括号,从 5.4 版开始可用。

这样做,您的最终代码可能是:

$query = [
    "fields" => ["timestamp", "user.raw", "mailbox", "verb", "backend"],
    "size"   => 1,
    "sort"   => [["@timestamp" => ["order" => $varOrder]]],
    "query"  => [
        "bool" => [
            "must" => [
                ["match" => ["verb"    => "open"]],
                ["term"  => [$varField => $varValue]]
            ]
        ]
    ]
];

这与您想要的语法相差不远。唯一的区别是 => 而不是 :。但是额外的好处是不需要用 {}.

声明 objects