自定义PHP json解码器

时间:2017-03-07 10:49:31

标签: php json xml duplicates

$json=
"{
"name":"John",
"name":"Karel"
}";

如果使用此json_decode($json, true);我得到array['name']="Karel"所以在解析后我得到以下xml:

的xml:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <name value="Karel"/>
</root>

我需要得到这个xml:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <name>
      <element>John</element>
      <element>Karel</element>
   </name>
</root>

我认为我需要自己的json解析器,我需要得到array['name']=["John","Karel"];然后我可以设法做到这一点。

编辑:  我无法编辑输入json。我需要从文件解码到关联数组,如果是相同的键,我需要在同一个索引上创建一个数组,并且两个值都相同。

好的整个JSONfile是这样的:

{
    "name":"John",
    "name":"Karel",
    "heslo":{"content":"Dam ten shit podle sebe"},
    "ageA":30,
    "d":21,
    "d":42,
    "ageB":30.2,
    "ageC":1,
    "ageD":0,
    "testChar":["&","<",">","\"", "'", "-"],
    "lada":{"pritelkyne":"Kristynka","plysak":"mimon", "vek":20, "oblibenýSeriál":"RobinsonůvOstrov"},
    "null":null,
    "boolT":true,
    "boolF":false,
    "cars":[ { "type": "Skoda", "number": "212 555-1234" },"Ford", "BMW",{ "type": "Hyundai", "number": "215 555-1234" }, "Fiat" ],
    "numbersSeven":[1,2,3,4,5,6,7],
    "numbersFourteen":[1,2,3,4,5,6,7,8,9,10,11,12,13,14],
    "numbersHundredOne":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101]
}

但它只是众多例子中的一个,我需要这样做,而不是这个json。

那我该怎么做解析呢?

2 个答案:

答案 0 :(得分:2)

您不能为不同的值使用相同的密钥。您可以将值存储在单个数组中,而不是这个。或者使用不同的数组,然后将其存储在另一个键中:

尝试使用以下代码:

$json : '{"names":[{"name":"John"},{
"name":"Karel"}]
}';

OR

$json = '{"name":["John","Karel"]}';

修改

作为已编辑的问题如果您收到此输入并想在reeving后更改json。您可以尝试以下代码(更改json字符串)

$json=
'{
"name":"John","name":"Karel"
}';

$json =  ltrim($json,"{");
$json= rtrim($json,"}");
$tmp_arr = (array_map('trim', explode(',', $json)));
$new_arr['name']=array();
foreach ($tmp_arr as $key => $value) {
  $val = explode(':', $value);
  if(count($val)>1){
    $val=$val[1];
    $val = str_replace('"', '', $val);
    $new_arr['name'][] = $val;
  }

}

echo json_encode($new_arr); //{"name":["John","Karel"]}

答案 1 :(得分:0)

尝试使用jsonarray:它看起来像[{“name”:“John”}, {“name”:“Karel”}] 所以试试这个

$arraysforjson = array();
$arraysforjson [] = array('name' => "$name")
$json = json_encode($d);