如何使用serializer(Symfony 4)以正确的格式创建json字符串?
我正在使用序列化程序创建json字符串:如何使用serializer(Symfony 4)以正确的格式创建json字符串?,json,symfony,doctrine,encode,serialization,Json,Symfony,Doctrine,Encode,Serialization,我正在使用序列化程序创建json字符串: $table = $this->getDoctrine()->getRepository(Article::class)->findAll(); $serializer = new Serializer(array(new GetSetMethodNormalizer()), array('json' => new JsonEncoder())); $json_string = $serializer->serialize
$table = $this->getDoctrine()->getRepository(Article::class)->findAll();
$serializer = new Serializer(array(new GetSetMethodNormalizer()), array('json' => new JsonEncoder()));
$json_string = $serializer->serialize($table, 'json');
$table的结果是:
array(2) { [0]=> object(App\Entity\Article)#5975 (3) { ["id":"App\Entity\Article":private]=> int(1) ["title":"App\Entity\Article":private]=> string(9) "Article 1" ["body":"App\Entity\Article":private]=> string(32) "This is the body for article one" } [1]=> object(App\Entity\Article)#5979 (3) { ["id":"App\Entity\Article":private]=> int(2) ["title":"App\Entity\Article":private]=> string(11) "Article Two" ["body":"App\Entity\Article":private]=> string(32) "This is the body for article two" } }
这是$json_字符串的结果:
string(145) "[{"id":1,"title":"Article 1","body":"This is the body for article one"},{"id":2,"title":"Article Two","body":"This is the body for article two"}]"
但这不是我需要的正确格式。我需要这样编码:
{
"recordsTotal": 10,
"recordsFiltered": 10,
"draw": 1,
"data": [
[
"Airi",
"Satou",
"Accountant",
"Tokyo",
"28th Nov 08",
"$162,700"
],
[
"Angelica",
"Ramos",
"Chief Executive Officer (CEO)",
"London",
"9th Oct 09",
"$1,200,000"
],
[
"Ashton",
"Cox",
"Junior Technical Author",
"San Francisco",
"12th Jan 09",
"$86,000"
],
[
"Bradley",
"Greer",
"Software Engineer",
"London",
"13th Oct 12",
"$132,000"
],
[
"Brenden",
"Wagner",
"Software Engineer",
"San Francisco",
"7th Jun 11",
"$206,850"
],
[
"Brielle",
"Williamson",
"Integration Specialist",
"New York",
"2nd Dec 12",
"$372,000"
],
[
"Bruno",
"Nash",
"Software Engineer",
"London",
"3rd May 11",
"$163,500"
],
[
"Caesar",
"Vance",
"Pre-Sales Support",
"New York",
"12th Dec 11",
"$106,450"
],
[
"Cara",
"Stevens",
"Sales Assistant",
"New York",
"6th Dec 11",
"$145,600"
],
[
"Cedric",
"Kelly",
"Senior Javascript Developer",
"Edinburgh",
"29th Mar 12",
"$433,060"
]
]
}
带标准化器的Aproach:
$normalizer = new ObjectNormalizer();
$encoder = new JsonEncoder();
$serializer = new Serializer(array($normalizer), array($encoder));
$json_string = $serializer->serialize($table, 'json');
结果:
string(145) "[{"id":1,"title":"Article 1","body":"This is the body for article one"},{"id":2,"title":"Article Two","body":"This is the body for article two"}]"
您可以通过
JsonSerializable
界面来控制这一点
class Article implements JsonSerializable {
public function jsonSerialize() {
$arr = [
$this->firstName,
$this->secondName,
//...
];
return $arr;
}
}
您可以通过
JsonSerializable
界面来控制这一点
class Article implements JsonSerializable {
public function jsonSerialize() {
$arr = [
$this->firstName,
$this->secondName,
//...
];
return $arr;
}
}
面对同样的问题,找到了以下解决方案:
$array = json_decode($serializer->serialize($object, 'json'), true);
$entryJSONFile = json_encode($array, JSON_PRETTY_PRINT);
这确实起到了作用,但我仍然不习惯双重转换。面对同样的问题,我找到了以下解决方案:
$array = json_decode($serializer->serialize($object, 'json'), true);
$entryJSONFile = json_encode($array, JSON_PRETTY_PRINT);
这确实起到了作用,但我仍然不习惯双重转换。我知道这是从2018年开始的。但我需要给出这个解决方案,经过几个小时的研究,我发现:
$response = new Response($serializer->serialize($data, JsonEncoder::FORMAT, [JsonEncode::OPTIONS => JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT]));
$response->headers->set('Content-Type', 'application/json');
return $response;
在Symfony 4.2中对我来说效果非常好,我知道这是从2018年开始的。但我需要给出这个解决方案,经过几个小时的研究,我发现:
$response = new Response($serializer->serialize($data, JsonEncoder::FORMAT, [JsonEncode::OPTIONS => JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT]));
$response->headers->set('Content-Type', 'application/json');
return $response;
在Symfony 4.2中,我的工作非常好。尝试将
$table
封装到一个包含键的数组中recordsTotal、recordsFiltered、draw、data
、parse$table
,并获得所需的数据。@AlexandrePainchaud不能直接创建一个包含键的数组吗?在这种情况下,我不确定。你只需要不带任何键的数据..用PHP实现这一点并不困难。我给你发了一个例子,说明每个属性的前缀都是org\uuu
。所以你可以直接返回'
。编辑规范化程序的目标是自定义键值尝试,以将$table
封装到一个包含键的数组中recordsTotal、recordsFiltered、draw、data
、parse$table
,并获取所需的数据。@AlexandrePainchaud无法直接创建一个包含键的数组?在这种情况下,我不确定。你只需要不带任何键的数据..用PHP实现这一点并不困难。我给你发了一个例子,说明每个属性的前缀都是org\uuu
。所以你可以直接返回'
。EditNormalizer的目标是自定义键实际上,您可以仅使用Normalizer避免双重转换:$array=$Normalizer->normalize($object)$entryJSONFile=json\u encode($array,json\u PRETTY\u PRINT);实际上,只使用normalizer可以避免双重转换:$array=$normalizer->normalize($object)$entryJSONFile=json\u encode($array,json\u PRETTY\u PRINT);