序列化器-序列化器对象需要哪些规范化器才能将json反序列化为对象

时间:2020-05-25 16:49:08

标签: symfony json-deserialization

我要转换此json

CREATE OR REPLACE FUNCTION get_measurements_by_node_and_date(nodeID INTEGER, firstDate date, lastDate date) 
RETURNS TABLE (measurement_id INTEGER, node_id INTEGER, carbon_dioxide DOUBLE PRECISION, 
               hydrocarbons DOUBLE PRECISION, temperature DOUBLE PRECISION, 
               humidity DOUBLE PRECISION, 
               air_pressure DOUBLE PRECISION, 
               measurement_timestamp timestamp without time zone ) AS
$$
BEGIN
   RETURN QUERY SELECT measurements_lora.id, 
                       measurements_lora.node_id,
                       measurements_lora.carbon_dioxide,
                       measurements_lora.hydrocarbons,
                       measurements_lora.temperature,
                       measurements_lora.humidity,
                       measurements_lora.air_pressure,
                       measurements_lora.measurement_timestamp AS  measure
                  FROM public.measurements_lora 
                  WHERE measurements_lora.measurement_timestamp <= lastDate 
                    AND measurements_lora.measurement_timestamp >= firstDate           
                    AND measurements_lora.node_id = nodeID;
END
$$ LANGUAGE plpgsql; 

变成单个对象。

[
    {
        "name": "1",
        "created": "2019-12-08T15:43:00.000Z"
    },
    {
        "name": "2",
        "created": "2019-12-08T15:43:00.000Z"
    }
]

我将其用作我的序列化器

class Persons
{
    /**
     * @var array<Person>
     */
    public array $persons = [];
}

class Person
{
    public string $name = '';
    public DateTimeInterface $created;
}

运行时

$encoder = [
    new JsonEncoder(),
];

$normalizer = [
    new DateTimeNormalizer(),
    new ObjectNormalizer(),
];

$serializer = new Serializer($normalizer, $encoder);

$persons = $serializer->deserialize($json, Persons::class, 'json'); var_dump($persons); 是一个空数组

那么我需要哪些规范化程序才能工作?

2 个答案:

答案 0 :(得分:0)

是的,这是因为您需要将操作与编码器/解码器匹配-JsonEncoder的{​​{1}}和serialize的调用的JsonDecoder:)

添加deserialize之后,我认为它应该可以工作...

答案 1 :(得分:0)

您的json不代表Persons对象,它是Persons的数组。根据{{​​3}} 您可以在类名后附加[]以反序列化对象数组:

$persons = $serializer->deserialize($json, Person::class.'[]', 'json');

然后,$persons应该是Person对象的数组。请注意,Person :: class是单数形式,而不是复数形式。

要反序列化为Persons :: class-如果出于任何原因坚持使用您的json,则必须将其嵌入到以下json中

{"persons": <here your json>} 

或您需要实现自己的序列化器(更具体地说,是您自己的非规范化器),并跳一些圈来使用它。 (我不确定,但是我相信php中对象数组的预期文档符号为@var []Person