【问题标题】:Symfony run through a JSON fileSymfony 通过 JSON 文件运行
【发布时间】:2020-07-01 22:28:20
【问题描述】:

我的错误是:警告:json_decode() 期望参数 1 是字符串,给定数组。

我想在我的数据库中保存实体。只有在 JSON 文件中放入一个元素但我想运行 JSON 文件并保存所有元素时,我才会成功。我不能做一个循环。

我有一个这样的 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, []);
    }
}

当我做 var_dump($jsonRecu); 时 $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, []);
    }

感谢您的帮助

【问题讨论】:

  • $jsonRecu 的内容是什么?使用var_dump($jsonRecu);
  • 我不认为错误来自上面显示的代码。
  • 报错的行和文件在哪里?请使用此信息更新您的问题。
  • @Nelly 所以它抱怨的是$data,而不是$jsonRecu。您问题的顶部似乎没有任何相关内容。所以现在你需要向我们展示$data 的内容并解释你期望json_decode($data, $associative, $recursionDepth, $options); 做什么。
  • @PatrickQ Nelly 提供了 symfony 反序列化器中的代码,而不是他们代码中导致错误的行,这必须是 $serializer->deserialize() 调用。他们添加的代码当然没有帮助。问题是由于期望字符串的反序列化调用引起的,而 json_decode 已经将整个字符串转换为数组数组,从而为反序列化调用提供了一个数组。

标签: php json database symfony


【解决方案1】:

我会将你的代码分成几部分并解释发生了什么。

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 以将其反序列化,但这很愚蠢。

【讨论】:

    猜你喜欢
    • 2011-08-07
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多