我有一个模型字段(“数据”),它如下映射到JSON MYSQL字段:
class Person {
/** @Id @Column(type="integer", name="person_id") @GeneratedValue **/
protected $id;
/** @Column(type="json") **/
protected $data;
/** @Column(type="string") **/
protected $name;
}
我能够查询和序列化Person,但是数据字段是嵌套的:
$person = $personRepository->find(11);
echo $serializer->serialize($person, 'json');
//returns {"id": 11, "name": "Daniel", "data": {"age": 57, "city": "Omaha"} }
我想取消嵌套data
字段,以便内联序列化。
//returns {"id": 11, "name": "Daniel", "age": 57, "city": "Omaha"}
这可能吗?
我在这里看到了不同的解决方案,从非常肮脏到“好吧,没关系”
所有不是很脏的解决方案(例如用字符串替换大括号和东西),都可以在标准化数组上工作:
$array = $serializer->normalize($person);
/** add code, that turns $array into flattened version $flattened */
$json = $serializer->encode($flattened, 'json');
现在,使数组变平的代码是什么……例如:
// if this is done in a loop, this, $flattened should be reinitialized every iteration!!!
$flattened = [];
array_walk_recursive($array, function($value, $key) use (&$flattened) {
$target[$key] = $value;
});
// $flattened contains the flattened array
不过稍长一些:
// define somewhere outside of loop
function flatten($array, $flattened = []) {
foreach($array as $key => $value) {
if(is_array($value)) {
$flattened = flatten($value, $flattened);
} else {
$flattened[$key] = $value;
}
}
return $flattened;
}
// call flatten
$flattened = flatten($array);
非常好用的解决方案是,将所有这些集成到您的自定义编码器中,从而扩展了json编码器,但我想这已经太过头了。
还请注意,这在很多情况下都可能并且会中断,因为键可以被覆盖,如果不对其进行迭代,则不能将其应用于对象数组,它可能会为嵌套对象等产生不必要的结果,等等。