创建遵循JSON:API约定的正确JSON输出

时间:2019-07-10 08:39:46

标签: php arrays json laravel laravel-5

我正在尝试解析数据库中存储的一些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"
  ]
]

因此请考虑对这个数组做一些事情,例如对单词PageSection进行替换:

$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格式吗?

2 个答案:

答案 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"}]