在 symfony 中反序列化对象返回异常 [关闭]

Posted

技术标签:

【中文标题】在 symfony 中反序列化对象返回异常 [关闭]【英文标题】:Deserializing an object in symfony return an exception [closed] 【发布时间】:2021-01-31 18:28:18 【问题描述】:

我遵循序列化器组件文档,将特定的 json 转换为对象 https://symfony.com/doc/current/components/serializer.html#deserializing-an-object 我发出这个调用是为了接收一个对象列表。

$response = $httpClient->request('GET', 'https://www.example.com/web/app.php/api/articles?next=1&Type=ep');
dump($response->getContent());

所以我有一个文章对象列表。


    "header": 
        "error": 0,
        "message": "ok",
        "next": 2
    ,
    "results": [
        
            "id": 17007,
            "title": "test article title 1"
        ,
        
            "id": 17008,
            "title": "sample article 2"
        
    ]

我想反序列化结果部分...问题是 Symfony 序列化器给了我一个空对象

$encoders = [new XmlEncoder(), new JsonEncoder()];
$normalizers = [new ObjectNormalizer()];
$serializer = new Serializer($normalizers, $encoders);
$articles = $serializer->deserialize($response->getContent(), Article::class, 'json');

请问有什么问题?

【问题讨论】:

请分享您所面临的完整而准确的错误信息 【参考方案1】:

既然时不时会出现这种问题,而且还不完全清楚,为什么不清楚问题出在哪里:

    $serializer->deserialize($response->getContent(), Article::class, 'json');

该行期望响应内容如下所示:


    "id": 1,
    "title": "title of just this one article"

这显然与您发布的响应内容不符。所以你基本上有两个选择:

1。剥离 json 包装器

反序列化是解码和反规范化的结合(see your link, but first paragraphs),所以我们可以做中间剥离:

$normalized = $serializer->decode($response->getContent(), 'json');
$articlesNormalized = $normalized['results'] ?? [];
$articles = $serializer->denormalize($articlesNormalized, Article::class . '[]');

请参阅this part about handling arrays,了解为什么需要添加. '[]'

2。反序列化为正确的类:

由于文章已包装,您可能还需要包装... - 您可能需要注释阅读器才能工作...

免责声明:我没有对此进行测试,但它应该可以工作......

class ArticleResponse 
    /** @var array */
    public $header;
    /** @var Article[] */ // <-- maybe this needs to be []Article, I'm never sure.
    public $results;

现在你可以这样做了:

$articleResponse = $serializer->deserialize($response->getContent(), ArticleResponse::class, 'json');
$articles = $articleResponse->articles;

【讨论】:

以上是关于在 symfony 中反序列化对象返回异常 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在javascript中反序列化json对象

C# 在单个对象中反序列化两个 Jarray 对象

Json 映射异常无法从 START_ARRAY 令牌中反序列化实例

理解异常的麻烦:“无法从 START_OBJECT 令牌中反序列化 `java.lang.String` 的实例”在 Jackson 中使用 ObjectMapper

在 C# 中反序列化复杂对象

在构造函数中反序列化 const 成员对象