【发布时间】:2019-11-19 20:16:59
【问题描述】:
我正在尝试解析存储在我的数据库中的一些 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 格式?
【问题讨论】:
-
你不应该改造它。该数组将自动编码为 json。演员表告诉 Laravel 模型应该期待一个数组。只需将对象更新为
$field->content = $out; -
我正在使用
str_replace对其进行转换,并希望将其再次保存到数据库中。我已经绑定了$field->content = $out,正如我在问题中所说,它将它保存为数组数组:[[...]]。 -
嗯,没错。您的初始数据是一个未编号的数组数组。这是典型的json。如果没有,您将有 3 个单独的 json 结果,因此数据库中有 3 个条目。
标签: php arrays json laravel laravel-5