PHP JSON解码:带有'$'问题的数组

时间:2011-06-10 18:26:17

标签: php json

我有以下JSON文件作为输入,

{
  "$type": "NanoWebInterpreter.WebInputData, NanoWebInterpreter",
  "NBBList": {
    "$type": "System.Collections.Generic.List`1[[monoTNP.Common.NBB, monoTNP.Common]], mscorlib",
    "$values": [
      {
        "$type": "monoTNP.Common.NBB, monoTNP.Common",
        "ID": "id-0065-00000003",
        "MPList": {
          "$type": "System.Collections.Generic.List`1[[monoTNP.Common.MP, monoTNP.Common]], mscorlib",
          "$values": [
            {
              "$type": "monoTNP.Common.EllipticalMP, monoTNP.Common",
              "Eccentricity": 1.0,
              "ID": "id-0065-00000006",
              "ParticleIndex": -1,
              "DispersionInteractionStrength": 0.0,
              "DispersionInteractionRange": 2.5,
              "CharacteristicSize": 0.0,
              "CenterOfMass": "<0,0,0>",
              "OrientationVector": "<>"
            },
            {
              "$type": "monoTNP.Common.CubeMP, monoTNP.Common",
              "ID": "id-0065-00000005",
              "ParticleIndex": -1,
              "DispersionInteractionStrength": 0.0,
              "DispersionInteractionRange": 2.5,
              "CharacteristicSize": 0.0,
              "CenterOfMass": "<0,0,0>",
              "OrientationVector": "<>"
            },
            {
              "$type": "monoTNP.Common.CircularMP, monoTNP.Common",
              "ID": "id-0065-00000004",
              "ParticleIndex": -1,
              "DispersionInteractionStrength": 0.0,
              "DispersionInteractionRange": 2.5,
              "CharacteristicSize": 0.0,
              "CenterOfMass": "<0,0,0>",
              "OrientationVector": "<>"
            }
          ]
        },

我的最终目标是以递归方式跟踪此树,使用<ul>标记包装每个键/对象名称,并在某种<form>结构中使用“ParticleIndex”级别的属性,但我可以弄清楚如何索引两个'$ values'数组。

这是我一直在操作的代码,用于了解如何访问每个元素(对象或数组):

foreach ($json->NBBList->'$values'[0] as $key => $value){
    var_dump($key);
    echo "\n".var_dump($value);
    echo "\n\n\n";
}

这显然不起作用,因为值的索引在字符串之外,但当它在内部时,PHP将其解释为字符串的一部分。

我有没有办法索引'$ values'数组的每个元素,最终在for循环中?

我认为使用JSON解码的“true”属性可能是更好的解决方案......

4 个答案:

答案 0 :(得分:6)

您可以使用以下表示法访问名称包含特殊字符的对象属性:

$json->NBBList->{'$values'}[0]

我不认为此行为会在任何地方记录,但您可以在PHP grammar中找到它(请参阅variable_name中使用的object_dim_list定义在object_property)。

答案 1 :(得分:4)

json_decodeassoc参数设置为false以获取数组(字典)而不是对象:

$json = json_decode($jsonInput, true);
foreach ($json['NBBList']['$values'][0] as $key => $value){
    var_dump($key);
    echo "\n";
    var_dump($value);
    echo "\n\n\n";
}

答案 2 :(得分:1)

foreach($json->NBBList->{'$values'}[0] as $key=>$value){

您可以在字符串周围使用花括号来访问具有特殊字符的对象的属性。

答案 3 :(得分:-2)

你尝试过类似的东西吗?

$show_values = $values[0];

foreach ($json->NBBList->'$show_values' as $key => $value){
var_dump($key);
echo "\n".var_dump($value);
echo "\n\n\n";

只是一个想法,我不确定它的效果如何