我正在尝试解析数据库中存储的一些JSON,对其进行转换,然后将其发送到第3方API(通过webhook)。我目前停留在JSON输出格式。我正在尝试遵循 JSON:API 的标准。
这是我在数据库列fields.content
中的输入:
[{"0": "Page 1, col 1.", "1": "", "2": ""}, {"0": "", "1": "Page 1, col 2.", "2": ""}, {"0": "", "1": "", "2": "Page 1, col 3"}]
如您所见,这是一个由对象组成的JSON数组。每个对象代表一行,每个键代表一列。可以如下所示:
___________________________________________________
| COL 1 | COL 2 | COL 3 |
___________________________________________________
| Page 1, col 1.| | |
|---------------|----------------|----------------|
| |Page 1, col 2. | |
|---------------|----------------|----------------|
| | | Page 1, col 3. |
---------------------------------------------------
在我的模型Field.php
中,我使用Laravel强制转换,例如:
protected $casts = [
'content' => 'array'
];
哪个会自动将json字符串转换为数组:
dd($content) //$content is the json string from the database
返回:
array:3 [▼
0 => array:3 [▼
0 => "Page 1, col 1."
1 => ""
2 => ""
]
1 => array:3 [▼
0 => ""
1 => "Page 1, col 2."
2 => ""
]
2 => array:3 [▼
0 => ""
1 => ""
2 => "Page 1, col 3"
]
]
因此请考虑对这个数组做一些事情,例如对单词Page
到Section
进行替换:
$out = [];
foreach ($content as $col => $rows) {
$out[$col] = str_replace('Page', 'Section', $rows);
}
dd($out);
这将返回:
array:3 [▼
0 => array:3 [▼
0 => "Section 1, col 1."
1 => ""
2 => ""
]
1 => array:3 [▼
0 => ""
1 => "Section 1, col 2."
2 => ""
]
2 => array:3 [▼
0 => ""
1 => ""
2 => "Section 1, col 3"
]
]
我现在想更新数据库fields.content
,以反映此更改。但是,当将其重新保存到数据库时,例如:
$field = Field::find(1);
$field->content = $out;
$field->save();
现在将其保存为数组数组:
[["Section 1, col 1.", "", ""], ["", "Section 1, col 2.", ""], ["", "", "Section 1, col 3"]]
这意味着当我通过Webhook发送此消息时,它不再遵循与开始时相同的JSON模式。
我尝试对数组进行json_encode,例如:
$field->content = [json_encode($out, JSON_FORCE_OBJECT)]
但这不会产生所需的输出/有效的JSON。
有人可以帮助我如何使用Laravel / PHP转换JSON对象,然后将其重新保存到数据库并保持初始有效的JSON:API格式吗?
答案 0 :(得分:0)
结果绝对正确。这是有效的数组表示形式。它是0、1 ...,这是一个数组索引,根据PHP,当序列化为字符串时,该索引将不会反映出来。
该怎么办?
直接投射到对象(JSON是对象而不是数组)。
protected $casts = [
'content' => 'object'
];
要将$content
转换为循环,可以使用以下内容代替dd
$content = json_decode(json_encode($content), true);
要进行解析,请尝试以下操作:
$out = [];
$i = 0;
foreach($content as $con){
$result = [];
foreach ($con as $col => $rows) {
$result[$col] = str_replace('Page', 'Section', $rows);
}
$out = array_merge($out, [$i => $result]);
}
$out = json_encode($out);
// Loose the dd($out) part.
免责声明 :我没有尝试。
答案 1 :(得分:0)
完成转换后:
$out = [];
foreach ($content as $col => $rows) {
$out[$col] = str_replace('Page', 'Section', $rows);
}
现在您可以使用以下代码重新格式化:
$result"[";
foreach ($out as $value) {
$string = json_encode($value);
$string = str_replace('[', '{', $string);
$string = str_replace(']', '}', $string);
$result .= $string .",";
}
$result= rtrim($result, ',');
$result.= "]";
echo $result;
// [{"Section 1, col 1.","",""},{"","Section 1, col 2.",""},{"","","Section 1, col 3"}]