我想通过代码创建以下JSON字符串。创建数组然后使用json_encode
将其转换为字符串的最简单方法。我该如何生成数组?递归数组应该是一个很好的解决方案。你能帮我修一下这个数组吗?
function getJSONString(){
echo generateJSONArray($currentnode);
}
function generateJSONArray($currentnode){
$jsonarr["id"] = $currentnode[0]->id;
$jsonarr["name"] = $currentnode[0]->name;
$jsonarr["data"] = "{}";
$childnodes = getChildNodes($currentnode); //gives child nodes
foreach($childnodes as $childnode){
$jsonarr["children"] = $this->generateJSONArray($childnode);
}
return json_encode($jsonarr);
}
希望生成以下JSON字符串。
var json = {
id: "node02",
name: "0.2",
data: {},
children: [{
id: "node13",
name: "1.3",
data: {},
children: [{
id: "node24",
name: "2.4",
data: {},
children: [{
id: "node35",
name: "3.5",
data: {},
children: [{
id: "node46",
name: "4.6",
data: {},
children: []
}]
}, {
id: "node37",
name: "3.7",
data: {},
children: [{
id: "node48",
name: "4.8",
data: {},
children: []
}, {
id: "node49",
name: "4.9",
data: {},
children: []
}, {
id: "node410",
name: "4.10",
data: {},
children: []
}, {
id: "node411",
name: "4.11",
data: {},
children: []
}]
}, {
id: "node312",
name: "3.12",
data: {},
children: [{
id: "node413",
name: "4.13",
data: {},
children: []
}]
}, {
id: "node314",
name: "3.14",
data: {},
children: [{
id: "node415",
name: "4.15",
data: {},
children: []
}, {
id: "node416",
name: "4.16",
data: {},
children: []
}, {
id: "node417",
name: "4.17",
data: {},
children: []
}, {
id: "node418",
name: "4.18",
data: {},
children: []
}]
}, {
id: "node319",
name: "3.19",
data: {},
children: [{
id: "node420",
name: "4.20",
data: {},
children: []
}, {
id: "node421",
name: "4.21",
data: {},
children: []
}]
}]
}, {
id: "node222",
name: "2.22",
data: {},
children: [{
id: "node323",
name: "3.23",
data: {},
children: [{
id: "node424",
name: "4.24",
data: {},
children: []
}]
}]
}]
}, {
id: "node125",
name: "1.25",
data: {},
children: [{
id: "node226",
name: "2.26",
data: {},
children: [{
id: "node327",
name: "3.27",
data: {},
children: [{
id: "node428",
name: "4.28",
data: {},
children: []
}, {
id: "node429",
name: "4.29",
data: {},
children: []
}]
}, {
id: "node330",
name: "3.30",
data: {},
children: [{
id: "node431",
name: "4.31",
data: {},
children: []
}]
}, {
id: "node332",
name: "3.32",
data: {},
children: [{
id: "node433",
name: "4.33",
data: {},
children: []
}, {
id: "node434",
name: "4.34",
data: {},
children: []
}, {
id: "node435",
name: "4.35",
data: {},
children: []
}, {
id: "node436",
name: "4.36",
data: {},
children: []
}]
}]
}, {
id: "node237",
name: "2.37",
data: {},
children: [{
id: "node338",
name: "3.38",
data: {},
children: [{
id: "node439",
name: "4.39",
data: {},
children: []
}, {
id: "node440",
name: "4.40",
data: {},
children: []
}, {
id: "node441",
name: "4.41",
data: {},
children: []
}]
}, {
id: "node342",
name: "3.42",
data: {},
children: [{
id: "node443",
name: "4.43",
data: {},
children: []
}]
}, {
id: "node344",
name: "3.44",
data: {},
children: [{
id: "node445",
name: "4.45",
data: {},
children: []
}, {
id: "node446",
name: "4.46",
data: {},
children: []
}, {
id: "node447",
name: "4.47",
data: {},
children: []
}]
}, {
id: "node348",
name: "3.48",
data: {},
children: [{
id: "node449",
name: "4.49",
data: {},
children: []
}, {
id: "node450",
name: "4.50",
data: {},
children: []
}, {
id: "node451",
name: "4.51",
data: {},
children: []
}, {
id: "node452",
name: "4.52",
data: {},
children: []
}, {
id: "node453",
name: "4.53",
data: {},
children: []
}]
}, {
id: "node354",
name: "3.54",
data: {},
children: [{
id: "node455",
name: "4.55",
data: {},
children: []
}, {
id: "node456",
name: "4.56",
data: {},
children: []
}, {
id: "node457",
name: "4.57",
data: {},
children: []
}]
}]
}, {
id: "node258",
name: "2.58",
data: {},
children: [{
id: "node359",
name: "3.59",
data: {},
children: [{
id: "node460",
name: "4.60",
data: {},
children: []
}, {
id: "node461",
name: "4.61",
data: {},
children: []
}, {
id: "node462",
name: "4.62",
data: {},
children: []
}, {
id: "node463",
name: "4.63",
data: {},
children: []
}, {
id: "node464",
name: "4.64",
data: {},
children: []
}]
}]
}]
}, {
id: "node165",
name: "1.65",
data: {},
children: [{
id: "node266",
name: "2.66",
data: {},
children: [{
id: "node367",
name: "3.67",
data: {},
children: [{
id: "node468",
name: "4.68",
data: {},
children: []
}, {
id: "node469",
name: "4.69",
data: {},
children: []
}, {
id: "node470",
name: "4.70",
data: {},
children: []
}, {
id: "node471",
name: "4.71",
data: {},
children: []
}]
}, {
id: "node372",
name: "3.72",
data: {},
children: [{
id: "node473",
name: "4.73",
data: {},
children: []
}, {
id: "node474",
name: "4.74",
data: {},
children: []
}, {
id: "node475",
name: "4.75",
data: {},
children: []
}, {
id: "node476",
name: "4.76",
data: {},
children: []
}]
}, {
id: "node377",
name: "3.77",
data: {},
children: [{
id: "node478",
name: "4.78",
data: {},
children: []
}, {
id: "node479",
name: "4.79",
data: {},
children: []
}]
}, {
id: "node380",
name: "3.80",
data: {},
children: [{
id: "node481",
name: "4.81",
data: {},
children: []
}, {
id: "node482",
name: "4.82",
data: {},
children: []
}]
}]
}, {
id: "node283",
name: "2.83",
data: {},
children: [{
id: "node384",
name: "3.84",
data: {},
children: [{
id: "node485",
name: "4.85",
data: {},
children: []
}]
}, {
id: "node386",
name: "3.86",
data: {},
children: [{
id: "node487",
name: "4.87",
data: {},
children: []
}, {
id: "node488",
name: "4.88",
data: {},
children: []
}, {
id: "node489",
name: "4.89",
data: {},
children: []
}, {
id: "node490",
name: "4.90",
data: {},
children: []
}, {
id: "node491",
name: "4.91",
data: {},
children: []
}]
}, {
id: "node392",
name: "3.92",
data: {},
children: [{
id: "node493",
name: "4.93",
data: {},
children: []
}, {
id: "node494",
name: "4.94",
data: {},
children: []
}, {
id: "node495",
name: "4.95",
data: {},
children: []
}, {
id: "node496",
name: "4.96",
data: {},
children: []
}]
}, {
id: "node397",
name: "3.97",
data: {},
children: [{
id: "node498",
name: "4.98",
data: {},
children: []
}]
}, {
id: "node399",
name: "3.99",
data: {},
children: [{
id: "node4100",
name: "4.100",
data: {},
children: []
}, {
id: "node4101",
name: "4.101",
data: {},
children: []
}, {
id: "node4102",
name: "4.102",
data: {},
children: []
}, {
id: "node4103",
name: "4.103",
data: {},
children: []
}]
}]
}, {
id: "node2104",
name: "2.104",
data: {},
children: [{
id: "node3105",
name: "3.105",
data: {},
children: [{
id: "node4106",
name: "4.106",
data: {},
children: []
}, {
id: "node4107",
name: "4.107",
data: {},
children: []
}, {
id: "node4108",
name: "4.108",
data: {},
children: []
}]
}]
}, {
id: "node2109",
name: "2.109",
data: {},
children: [{
id: "node3110",
name: "3.110",
data: {},
children: [{
id: "node4111",
name: "4.111",
data: {},
children: []
}, {
id: "node4112",
name: "4.112",
data: {},
children: []
}]
}, {
id: "node3113",
name: "3.113",
data: {},
children: [{
id: "node4114",
name: "4.114",
data: {},
children: []
}, {
id: "node4115",
name: "4.115",
data: {},
children: []
}, {
id: "node4116",
name: "4.116",
data: {},
children: []
}]
}, {
id: "node3117",
name: "3.117",
data: {},
children: [{
id: "node4118",
name: "4.118",
data: {},
children: []
}, {
id: "node4119",
name: "4.119",
data: {},
children: []
}, {
id: "node4120",
name: "4.120",
data: {},
children: []
}, {
id: "node4121",
name: "4.121",
data: {},
children: []
}]
}, {
id: "node3122",
name: "3.122",
data: {},
children: [{
id: "node4123",
name: "4.123",
data: {},
children: []
}, {
id: "node4124",
name: "4.124",
data: {},
children: []
}]
}]
}, {
id: "node2125",
name: "2.125",
data: {},
children: [{
id: "node3126",
name: "3.126",
data: {},
children: [{
id: "node4127",
name: "4.127",
data: {},
children: []
}, {
id: "node4128",
name: "4.128",
data: {},
children: []
}, {
id: "node4129",
name: "4.129",
data: {},
children: []
}]
}]
}]
}, {
id: "node1130",
name: "1.130",
data: {},
children: [{
id: "node2131",
name: "2.131",
data: {},
children: [{
id: "node3132",
name: "3.132",
data: {},
children: [{
id: "node4133",
name: "4.133",
data: {},
children: []
}, {
id: "node4134",
name: "4.134",
data: {},
children: []
}, {
id: "node4135",
name: "4.135",
data: {},
children: []
}, {
id: "node4136",
name: "4.136",
data: {},
children: []
}, {
id: "node4137",
name: "4.137",
data: {},
children: []
}]
}]
}, {
id: "node2138",
name: "2.138",
data: {},
children: [{
id: "node3139",
name: "3.139",
data: {},
children: [{
id: "node4140",
name: "4.140",
data: {},
children: []
}, {
id: "node4141",
name: "4.141",
data: {},
children: []
}]
}, {
id: "node3142",
name: "3.142",
data: {},
children: [{
id: "node4143",
name: "4.143",
data: {},
children: []
}, {
id: "node4144",
name: "4.144",
data: {},
children: []
}, {
id: "node4145",
name: "4.145",
data: {},
children: []
}, {
id: "node4146",
name: "4.146",
data: {},
children: []
}, {
id: "node4147",
name: "4.147",
data: {},
children: []
}]
}]
}]
}]
};
编辑:--------------------------------------------- -----------------
我尝试了上面的代码并提出了以下建议,但现在我的JSON字符串变为“null”,而我的children数组总是为空。我猜,这背后的原因是递归数组不返回任何东西。但是,我不确定,在哪里添加return子句。
更正代码:
function getJSONString(){
echo json_encode($this->generateJSONArray($currentrole)); // this echo null
}
function generateJSONArray($currentrole){
$jsonarr = array();
$jsonarr["id"] = $currentnode[0]->id;
$jsonarr["name"] = $currentnode[0]->name;
$jsonarr["data"] = "";
$childnodes = getChildNodes($currentnode); //gives child nodes
$jsonarr['children'] = array();
foreach($childnodes as $childnode){
$jsonarr["children"][] = $this->generateJSONArray($childnode);
}
print_r($jsonarr); // to see what the array looks like
}
Resonpse: 数组([id] => H3-7 [名称] =>测试用户 副总统 [data] => [children] =>数组([0] => [1] => [2] =>))
答案 0 :(得分:0)
从您的代码的外观来看,您可能会收到很多被编码多次的孩子。您只应在完整数组上运行json_encode
一次。
因此,不是每次都返回json_encode
,而是返回一个数组:
return $jsonarr; // instead of return json_encode($jsonarr);
然后在你的getJSONString中,执行你的json_encode
:
function getJSONString(){
echo json_encode(generateJSONArray($currentnode));
}
编辑:您还有另一个问题,您的“孩子”不正确。这只会将孩子设置为最后一个孩子,而不会是你想要的收藏品。
$jsonarr["children"] = $this->generateJSONArray($childnode);
你首先要让'children'成为一个数组,然后追加那个数组:
$jsonarr['children'] = [];
foreach($childnodes as $childnode){
$jsonarr['children'][] = $this->generateJSONArray($childnode);
}
此外,$jsonarr["data"] = "{}";
将作为字符串进行转义。通过执行以下操作使其成为空对象:
$jsonarr["data"] = new stdClass();
或者,你也可以通过类型化一个空数组来做到这一点。如果您要添加密钥并将其用作数组,我只会推荐这个。