Создание правильного вывода JSON, соответствующего JSON: соглашение API - PullRequest
1 голос
/ 10 июля 2019

Я пытаюсь проанализировать некоторый JSON, который хранится в моей базе данных, преобразовать его и затем отправить его стороннему 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.

Может ли кто-нибудь помочь мне с тем, как преобразовать мой объект JSON с помощью Laravel / PHP и повторно сохранить его в моей базе данных и сохранить исходный действительный формат JSON: API?

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

После того, как вы сделали преобразование:

$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"}]
0 голосов
/ 10 июля 2019

Результат абсолютно верный.Это допустимое представление массива.Если 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.

Отказ от ответственности : я не смог попробовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...