Symfony запустить через JSON файл - PullRequest
0 голосов
/ 20 марта 2020

Моя ошибка: Предупреждение: json_decode () ожидает, что параметр 1 будет строкой, задан массив.

Я хотел бы сохранить сущности в моей базе данных. У меня получится, только если я добавлю один элемент в файл JSON, но я хочу запустить файл JSON и сохранить все элементы. Я не могу сделать все oop.

У меня есть JSON Файл, подобный следующему:

[
    {
        "nom": "tablette",
        "url": "http://www.cdiscount.com/opa.aspx/?trackingid=idXtspN-9-e2eKH4rjay8tNG2NeGkp5QZdUVk2714qK1CHkFJHIjbIK2itfMOQIL&action=product&id=MD513NFA&offerid=175431240",
        "prix": 199.9900,
        "description": "Tablette tactile avec écran 9,7\" capacitif - Processeur Apple A6X bicoeur avec processeur graphique quadricoeur- Stockage 16Go - WiFi 802.11 b/g/n - Camera avant 1,2Mpixels - Caméra arrière 5Mpixels - Connecteur Lightning reversible - Jusqu’à 10h d'autonomie - Garantie 1 an",
        "image": "http://i2.cdscdn.com/pdt2/N/F/A/1/700x700/MD513NFA.jpg"
    },
    {
        "nom": "autre",
        "url": "http://www.cdiscount.com/opa.aspx/?trackingid=idXtspN-9-e2eKH4rjay8tNG2NeGkp5QZdUVk2714qK1CHkFJHIjbIK2itfMOQIL&action=product&id=MD513NFA&offerid=175431240",
        "prix": 20.0,
        "description": "Autre Tablette tactile avec écran 9,7\" capacitif - Processeur Apple A6X bicoeur avec processeur graphique quadricoeur- Stockage 16Go - WiFi 802.11 b/g/n - Camera avant 1,2Mpixels - Caméra arrière 5Mpixels - Connecteur Lightning reversible - Jusqu’à 10h d'autonomie - Garantie 1 an",
        "image": "http://i2.cdscdn.com/pdt2/N/F/A/1/700x700/MD513NFA.jpg"
    }
]

Ниже моего кода в Symfony 4:

public function store(Request $request, SerializerInterface $serializer, EntityManagerInterface $em)
{
    $jsonRecu =file_get_contents("api.json");
    $someArray = json_decode($jsonRecu, true);
    print_r($someArray);
    foreach ($someArray as $item) {
        $article=  $serializer->deserialize($item, Article::class, 'json');
        $em->persist($article);
        $em->flush();
        return $this->json($article, 201, []);
    }
}

содержимое $ jsonRecu, когда я do var_dump ($ jsonRecu); это:

string(1260) "[ { "nom": "tablette", "url": "http://www.cdiscount.com/opa.aspx/?trackingid=idXtspN-9-e2eKH4rjay8tNG2NeGkp5QZdUVk2714qK1CHkFJHIjbIK2itfMOQIL&action=product&id=MD513NFA&offerid=175431240", "prix": 199.9900, "description": "Tablette tactile avec écran 9,7\" capacitif - Processeur Apple A6X bicoeur avec processeur graphique quadricoeur- Stockage 16Go - WiFi 802.11 b/g/n - Camera avant 1,2Mpixels - Caméra arrière 5Mpixels - Connecteur Lightning reversible - Jusqu’à 10h d'autonomie - Garantie 1 an", "image": "http://i2.cdscdn.com/pdt2/N/F/A/1/700x700/MD513NFA.jpg" }, { "nom": "autre", "url": "http://www.cdiscount.com/opa.aspx/?trackingid=idXtspN-9-e2eKH4rjay8tNG2NeGkp5QZdUVk2714qK1CHkFJHIjbIK2itfMOQIL&action=product&id=MD513NFA&offerid=175431240", "prix": 20.0, "description": "Autre Tablette tactile avec écran 9,7\" capacitif - Processeur Apple A6X bicoeur avec processeur graphique quadricoeur- Stockage 16Go - WiFi 802.11 b/g/n - Camera avant 1,2Mpixels - Caméra arrière 5Mpixels - Connecteur Lightning reversible - Jusqu’à 10h d'autonomie - Garantie 1 an", "image": "http://i2.cdscdn.com/pdt2/N/F/A/1/700x700/MD513NFA.jpg" } ]"

РЕДАКТИРОВАТЬ

код ниже работает отлично:

 public function store(Request $request, SerializerInterface $serializer, EntityManagerInterface $em)
    {
        $jsonRecu =file_get_contents("api.json");
        $arrayOfProperObjects = $serializer->deserialize($jsonRecu, Article::class.'[]', 'json');
        var_dump($arrayOfProperObjects);
        foreach ($arrayOfProperObjects as $article) {
            $em->persist($article);
            $em->flush();

        }
        return $this->json($article, 201, []);
    }

Спасибо за вашу помощь

1 Ответ

1 голос
/ 21 марта 2020

Я разделю ваш код на части и объясню, что происходит.

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, чтобы затем десериализовать его, но это было бы довольно глупо.

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