【问题标题】:PHP JSON decode: array with '$' problemPHP JSON解码:带有'$'问题的数组
【发布时间】:2011-06-11 02:40:09
【问题描述】:

我有以下 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": "<>"
            }
          ]
        },

等等

我的最终目标是递归地跟踪这棵树,用&lt;ul&gt; 标记包装每个键/对象名称,以及某种&lt;form&gt; 结构中的“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 解码的“真实”属性可能是一个更好的解决方案...

【问题讨论】:

标签: php json


【解决方案1】:

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

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

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

【讨论】:

  • 对于它的价值,json_decode() docs 中有一个例子。
  • @salathe:好吧。我在 OOP 部分中查找了文档。谁能想到他们已经把它放到了 JSON 文档中^^
  • 这个问题被问到 很多 所以一个例子(比如 SimpleXML)是有意义的。 :)
【解决方案2】:

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

【讨论】:

    【解决方案3】:
    foreach($json->NBBList->{'$values'}[0] as $key=>$value){
    

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

    【讨论】:

      【解决方案4】:

      你试过类似的东西吗?

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

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

      【讨论】:

      • 你必须用{''} 包裹奇怪的名字,即使你想迭代它。
      • 感谢指点,刚才看到另一个帖子里的json_decode字符串让我想起了
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 2018-10-17
      • 1970-01-01
      • 2012-10-20
      相关资源
      最近更新 更多