我有JSON:
"{"description":"Testing","site":"http:\/\/localhost","steps":{"step":[{"command":"grabimage","parameter":"img[alt=\"Next\"]"},{"command":"click","parameter":"img[alt=\"Previous\"]"}]}}"
由SimpleXML从XML文件生成动态:
<?xml version="1.0"?>
<pullcase>
<description>Testing</description>
<site>http://localhost:81</site>
<steps>
<step>
<command>grabimage</command>
<parameter>img[alt="Next"]</parameter>
</step>
</steps>
</pullcase>
它包含一个可能无限数量的&#34;步骤&#34;在&#34;步骤&#34;。当只有一个步骤时,数组生成为:
["steps"]=>
array(1) {
["step"]=>
array(2) {
["command"]=>
string(9) "grabimage"
["parameter"]=>
string(15) "img[alt="Next"]"
}
}
当有多个步骤时,它会生成为:
["steps"]=>
array(1) {
["step"]=>
array(2) {
[0]=>
array(2) {
["command"]=>
string(9) "grabimage"
["parameter"]=>
string(15) "img[alt="Next"]"
}
[1]=>
array(2) {
["command"]=>
string(5) "click"
["parameter"]=>
string(19) "img[alt="Previous"]"
}
}
}
如何让为一个子元素生成的数组遵循与多个子元素相同的规则?:
["steps"]=>
array(1) {
["step"]=>
array(1) {
[0]=>
array(2) {
["command"]=>
string(9) "grabimage"
["parameter"]=>
string(15) "img[alt="Next"]"
}
}
答案 0 :(得分:0)
json_decode()
不应该受到责备。 JSON结构定义它是一个数组还是仅一个元素。
这是一个精简的例子。它避免使用JSON_OBJECT_AS_ARRAY
,因此对象被解码为stdClass
实例,并且阵列更容易被发现。
$json = <<<'JSON'
{
"key": {
"list_example": [
{
"key": "value"
}
]
}
}
JSON;
var_dump(json_decode($json));
输出:
object(stdClass)#1 (1) {
["key"]=>
object(stdClass)#2 (1) {
["list_example"]=>
array(1) {
[0]=>
object(stdClass)#3 (1) {
["key"]=>
string(5) "value"
}
}
}
}
您可以看到list_example
包含数组。
问题在于生成JSON的源代码。 XML to JSON映射器将是典型的候选者。
答案 1 :(得分:0)
您只需要将单个子数组数组覆盖为包含“本身”的索引数组。
代码(Demo)
$json='{"description":"Testing","site":"http:\\/\\/localhost","steps":{"step":{"command":"grabimage","parameter":"img[alt=\\"1Next\\"]"}}}';
$array=json_decode($json,true);
if(key($array['steps']['step'])==='command'){ // if first key is "command" it is not indexed (in other words, "lone")
$array['steps']['step']=[$array['steps']['step']]; // position the lone subarray (deeper) in an indexed subarray.
}
var_export($array);
输出:
array (
'description' => 'Testing',
'site' => 'http://localhost',
'steps' =>
array (
'step' =>
array (
0 =>
array (
'command' => 'grabimage',
'parameter' => 'img[alt="1Next"]',
),
),
),
)