【问题标题】:How to decode json string into half array/ half object?如何将 json 字符串解码为半数组/半对象?
【发布时间】:2015-09-11 05:47:10
【问题描述】:

我有以下 json 字符串

$str = '{"icwsCallQueue":{"1002598152":{"AccoRDI_account_id":"","AccoRDI_mid":"","Eic_CallDirection":"O","Eic_CallIdKey":"100259815260150624","Eic_CallState":"Disconnected","Eic_ConferenceId":"","Eic_ConferenceMembers":"","Eic_ImmediateAccess":"1","Eic_LocalName":"Full Name","Eic_LocalUserId":"username","Eic_MonitorsCombinedCount":"0","Eic_Muted":"","Eic_ObjectType":"Call","Eic_ParentConferenceId":"","Eic_RemoteAddress":"307","Eic_RemoteName":"username-test","Eic_State":"I"},"1002598162":{"AccoRDI_account_id":"","AccoRDI_mid":"","Eic_CallDirection":"O","Eic_CallIdKey":"100259816260150624","Eic_CallState":"Disconnected","Eic_ConferenceId":"","Eic_ConferenceMembers":"","Eic_ImmediateAccess":"1","Eic_LocalName":"Full Name","Eic_LocalUserId":"username","Eic_MonitorsCombinedCount":"0","Eic_Muted":"","Eic_ObjectType":"Call","Eic_ParentConferenceId":"","Eic_RemoteAddress":"307","Eic_RemoteName":"username-test","Eic_State":"I"}}}';

如果我使用 json_decode($str) 解码它 我得到以下内容

stdClass Object
(
    [icwsCallQueue] => stdClass Object
        (
            [1002598152] => stdClass Object
                (
                    [AccoRDI_account_id] => 
                    [AccoRDI_mid] => 
                    [Eic_CallDirection] => O
                    [Eic_CallIdKey] => 100259815260150624
                    [Eic_CallState] => Disconnected
                    [Eic_ConferenceId] => 
                    [Eic_ConferenceMembers] => 
                    [Eic_ImmediateAccess] => 1
                    [Eic_LocalName] => Full Name
                    [Eic_LocalUserId] => username
                    [Eic_MonitorsCombinedCount] => 0
                    [Eic_Muted] => 
                    [Eic_ObjectType] => Call
                    [Eic_ParentConferenceId] => 
                    [Eic_RemoteAddress] => 307
                    [Eic_RemoteName] => username-test
                    [Eic_State] => I
                )

            [1002598162] => stdClass Object
                (
                    [AccoRDI_account_id] => 
                    [AccoRDI_mid] => 
                    [Eic_CallDirection] => O
                    [Eic_CallIdKey] => 100259816260150624
                    [Eic_CallState] => Disconnected
                    [Eic_ConferenceId] => 
                    [Eic_ConferenceMembers] => 
                    [Eic_ImmediateAccess] => 1
                    [Eic_LocalName] => Full Name
                    [Eic_LocalUserId] => username
                    [Eic_MonitorsCombinedCount] => 0
                    [Eic_Muted] => 
                    [Eic_ObjectType] => Call
                    [Eic_ParentConferenceId] => 
                    [Eic_RemoteAddress] => 307
                    [Eic_RemoteName] => username-test
                    [Eic_State] => I
                )

        )

)

这个问题是我无法访问只有整数的属性。我不能这样做$icwsCallQueue->100259152->Eic_State 所以我需要做一些如何将我解码的字符串转换成这样的东西

stdClass Object
(
    [icwsCallQueue] => Array
        (
            [1002598152] => stdClass Object
                (
                    [AccoRDI_account_id] => 
                    [AccoRDI_mid] => 
                    [Eic_CallDirection] => O
                    [Eic_CallIdKey] => 100259815260150624
                    [Eic_CallState] => Disconnected
                    [Eic_ConferenceId] => 
                    [Eic_ConferenceMembers] => 
                    [Eic_ImmediateAccess] => 1
                    [Eic_LocalName] => Full Name
                    [Eic_LocalUserId] => username
                    [Eic_MonitorsCombinedCount] => 0
                    [Eic_Muted] => 
                    [Eic_ObjectType] => Call
                    [Eic_ParentConferenceId] => 
                    [Eic_RemoteAddress] => 307
                    [Eic_RemoteName] => username-test
                    [Eic_State] => I
                )

            [1002598162] => stdClass Object
                (
                    [AccoRDI_account_id] => 
                    [AccoRDI_mid] => 
                    [Eic_CallDirection] => O
                    [Eic_CallIdKey] => 100259816260150624
                    [Eic_CallState] => Disconnected
                    [Eic_ConferenceId] => 
                    [Eic_ConferenceMembers] => 
                    [Eic_ImmediateAccess] => 1
                    [Eic_LocalName] => Full Name
                    [Eic_LocalUserId] => username
                    [Eic_MonitorsCombinedCount] => 0
                    [Eic_Muted] => 
                    [Eic_ObjectType] => Call
                    [Eic_ParentConferenceId] => 
                    [Eic_RemoteAddress] => 307
                    [Eic_RemoteName] => username-test
                    [Eic_State] => I
                )

        )

)

所以我可以像$icwsCallQueue['100259152']->Eic_State这样访问记录

另一方面,如果我像 json_decode($str, true) 这样解码字符串,所有内容都将显示为数组,这不是我要寻找的。​​p>

知道如何在必须使用数组时用数组解码字符串,在可以避免使用数组时使用对象吗?

【问题讨论】:

  • 试试这个吧? $icwsCallQueue->{100259152}->Eic_State。另外,你可以通过索引访问对象吗?
  • stackoverflow.com/questions/7027615/… 适用于任何“非法”键名。
  • 如果您不需要直接访问$icwsCallQueue 属性,则可以迭代。
  • 或者你也可以将你想要的部分转换成一个数组(根据settype()等)

标签: php arrays json decode icws


【解决方案1】:

您可以在需要时将数组转换为标准类,并将标准类转换为数组。

首先json_decode($str, true)获取关联版本的数据。 然后遍历数据的最内部部分并将数组再次转换回对象。现在可以使用 stdclass 属性作为访问器。

  $str = '{"icwsCallQueue":{"1002598152":{"AccoRDI_account_id":"","AccoRDI_mid":"","Eic_CallDirection":"O","Eic_CallIdKey":"100259815260150624","Eic_CallState":"Disconnected","Eic_ConferenceId":"","Eic_ConferenceMembers":"","Eic_ImmediateAccess":"1","Eic_LocalName":"Full Name","Eic_LocalUserId":"username","Eic_MonitorsCombinedCount":"0","Eic_Muted":"","Eic_ObjectType":"Call","Eic_ParentConferenceId":"","Eic_RemoteAddress":"307","Eic_RemoteName":"username-test","Eic_State":"I"},"1002598162":{"AccoRDI_account_id":"","AccoRDI_mid":"","Eic_CallDirection":"O","Eic_CallIdKey":"100259816260150624","Eic_CallState":"Disconnected","Eic_ConferenceId":"","Eic_ConferenceMembers":"","Eic_ImmediateAccess":"1","Eic_LocalName":"Full Name","Eic_LocalUserId":"username","Eic_MonitorsCombinedCount":"0","Eic_Muted":"","Eic_ObjectType":"Call","Eic_ParentConferenceId":"","Eic_RemoteAddress":"307","Eic_RemoteName":"username-test","Eic_State":"I"}}}';
  $json = json_decode($str, true);
  foreach($json["icwsCallQueue"] as $key => $element) {
    $json["icwsCallQueue"][$key] = (object)$element;
  }
  var_dump($json["icwsCallQueue"]['1002598152']->Eic_CallIdKey);
  var_dump($json["icwsCallQueue"]['1002598162']->Eic_CallIdKey);

还有另一个更简单的解决方案,但我无法让它发挥作用。这就是为什么我必须迭代所有数组。

  $str = '{"icwsCallQueue":{"1002598152":{"AccoRDI_account_id":"","AccoRDI_mid":"","Eic_CallDirection":"O","Eic_CallIdKey":"100259815260150624","Eic_CallState":"Disconnected","Eic_ConferenceId":"","Eic_ConferenceMembers":"","Eic_ImmediateAccess":"1","Eic_LocalName":"Full Name","Eic_LocalUserId":"username","Eic_MonitorsCombinedCount":"0","Eic_Muted":"","Eic_ObjectType":"Call","Eic_ParentConferenceId":"","Eic_RemoteAddress":"307","Eic_RemoteName":"username-test","Eic_State":"I"},"1002598162":{"AccoRDI_account_id":"","AccoRDI_mid":"","Eic_CallDirection":"O","Eic_CallIdKey":"100259816260150624","Eic_CallState":"Disconnected","Eic_ConferenceId":"","Eic_ConferenceMembers":"","Eic_ImmediateAccess":"1","Eic_LocalName":"Full Name","Eic_LocalUserId":"username","Eic_MonitorsCombinedCount":"0","Eic_Muted":"","Eic_ObjectType":"Call","Eic_ParentConferenceId":"","Eic_RemoteAddress":"307","Eic_RemoteName":"username-test","Eic_State":"I"}}}';
  $json = json_decode($str);
  $jsonArray = (array)$json->icwsCallQueue;
  var_dump($jsonArray["1002598152"]);
  //PHP Notice:  Undefined offset: 1002598152 in 

看起来 PHP 没有使用整数键正确转换为数组。或者我在这里缺少一些东西。

剩下的就看你的想象了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-24
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多