Я разделю ваш код на части и объясню, что происходит.
public function store(Request $request, SerializerInterface $serializer, EntityManagerInterface $em)
{
$jsonRecu = file_get_contents("api.json");
на данный момент $ jsonRecu содержит строку. это нормально.
$someArray = json_decode($jsonRecu, true);
здесь $someArray
содержит полностью декодированные объекты, то есть массив массивов .
print_r($someArray);
foreach ($someArray as $item) {
$article= $serializer->deserialize($item, Article::class, 'json');
, и вот в чем проблема , $item
явно не строка. Десериализация всегда ожидает строку. таким образом сообщение об ошибке. (Я пропущу тот факт, что вы вернетесь после первой статьи, полностью игнорируя вторую статью в процессе ...)
сейчас, чтобы исправить это:
вариант 1: использовать сериализатор для десериализации $jsonRecu
сериализатор вполне способен десериализовать массив объектов из строки, кодированной json, соответствующая часть в документации выглядит так: https://symfony.com/doc/current/components/serializer.html#handling -arrays который говорит вам, что вы должны добавить []
к имени класса, так:
$arrayOfProperObjects = $serializer->deserialize($jsonRecu, Article::class.'[]', 'json');
foreach($arrayOfProperObjects as $article) {
$em->persist($article);
// ...
}
вариант 2: вместо этого используйте денормализатор
в $someArray
каждые $item
само по себе $array
. десериализация работает на строки, хотя. Однако десериализация в symfony работает в два этапа: 1. декодирование, 2. денормализация, когда декодирование превращает string
(сериализовано) в array
(нормализовано), а денормализация превращает array
в собственное объект. Поскольку у вас уже есть массив - который, как мы надеемся, соответствует ожидаемому нормализованному формату - вы должны иметь возможность превратить его в правильный объект, вызвав вместо этого denormalize
.
foreach ($someArray as $item) {
$article = $serializer->denormalize($item, Article::class);
// etc. ...
, очевидно, есть и другие варианты, например. .. перекодировать $item
в json, чтобы затем десериализовать его, но это было бы довольно глупо.