【问题标题】:custom PHP json decoder自定义 PHP json 解码器
【发布时间】:2017-07-27 12:58:44
【问题描述】:
$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 执行此操作。

那我应该怎么解析呢?

【问题讨论】:

  • 这与 json_decode 无关,您需要重构您的数组。
  • 我应该如何重构数组?
  • 我不认为重构数组会起作用我没有数组中的值我丢失了它们,我从 json 文件解码
  • 澄清一下,那个 JSON 文件是无效,因为你有相同的键和两个不同的值。如果你不能改变它,你需要知道大多数 JSON 解析器要么会产生错误,要么会丢弃部分数据(我认为规范将它留给实现者做什么,但是“创建一个拥有两个值的新结构”是不太可能的。)
  • 有几个可以提供帮助 - one I wroteanother from someone else that takes a different approach。它们都是流式解析器,因此它们允许您一次访问每个元素,但您必须投入更多的工作来构建您想要的结构。

标签: php json xml duplicates


【解决方案1】:

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

尝试以下代码:

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

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

编辑

作为已编辑的问题,如果您收到此输入并希望在收到此输入后更改 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"]}

【讨论】:

  • 我认为第二个示例将在问题中输出所需的输出
  • 我做不到,我需要在解码中做。
  • 但它永远不会执行相同的键。它总是取最后一个值,因为最后一个将替换以前的值
  • 我不明白为什么会发生,但我需要像上面所说的那样保存这两个值
  • 好吧,你可以对每个键都这样做,而不仅仅是“名称”吗? :-) 我需要对整个 json 字符串执行此操作,通常为每个键
【解决方案2】:

尝试使用 jsonarray :它看起来像 [ {"name":"John"}, {“名称”:“卡雷尔”} ] 所以试试这个

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

【讨论】:

  • 我需要解码而不是编码,我需要在我的 json 文件中的密钥我没有只有名称作为密钥,这只是剪断的 json
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 2018-09-15
  • 2019-11-29
相关资源
最近更新 更多