PHP JSON decode: массив с проблемой '$' - PullRequest
6 голосов
/ 10 июня 2011

У меня есть следующий 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-декодирования может быть лучшим решением ...

Ответы [ 4 ]

6 голосов
/ 10 июня 2011

Вы можете получить доступ к свойствам объекта с именами, которые содержат специальные символы, используя эту запись:

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

Я не думаю, что это поведение где-либо задокументировано, но вы можете найти его в грамматике PHP (см. Определение variable_name, которое используется в object_dim_list, которое используется в object_property).

4 голосов
/ 10 июня 2011

Установите для параметра assoc json_decode значение 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 голос
/ 10 июня 2011
foreach($json->NBBList->{'$values'}[0] as $key=>$value){

Вы можете использовать фигурные скобки вокруг строки для доступа к свойствам объекта со специальными символами.

0 голосов
/ 10 июня 2011

Вы пробовали что-то вроде?

$show_values = $values[0];

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

Просто идея, я не уверен, насколько хорошо это будет работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...