PHP JSON解码:包含'$'问题的数组

6

我有以下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>标签包裹每个键/对象名称,并将“ParticleIndex”级别的属性放入某种<form>结构中,但我无法理解如何索引这两个“$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 decode的"true"属性可能是更好的解决方案...


4
我为您格式化了帖子。 - Lightness Races in Orbit
JSON格式化后仍然无效。 - hakre
可能是重复的问题:http://stackoverflow.com/questions/6264598/php-decoding-json - hakre
4个回答

6
您可以使用这种表示法访问包含特殊字符的对象属性名称:
$json->NBBList->{'$values'}[0]

我认为这种行为在任何地方都没有被记录,但是您可以在PHP语法中找到它(请参见variable_name的定义,在object_dim_list中使用,在object_property中使用)。


2
说句实话,在json_decode()文档中有一个例子。 - salathe
@salathe:啊,好的。我已经在面向对象编程(OOP)部分查找文档了。谁能想到他们把它放在JSON文档中^^ - NikiC
这个问题被问了很多次,所以提供一个例子(比如使用SimpleXML)是有意义的。 :) - salathe

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";
}

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

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

-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";

这只是一个想法,我不确定它能否奏效


即使您想要迭代它,也必须使用 {''} 将奇怪的名称包裹起来。 - Matthew
感谢您的指针,看到另一篇帖子中的json_decode字符串刚刚提醒了我。 - Ryan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接