我要转换此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);
是一个空数组
那么我需要哪些规范化程序才能工作?
答案 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
)