在 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 中反序列化对象返回异常 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Json 映射异常无法从 START_ARRAY 令牌中反序列化实例
理解异常的麻烦:“无法从 START_OBJECT 令牌中反序列化 `java.lang.String` 的实例”在 Jackson 中使用 ObjectMapper