【问题标题】:Php json string object to php arrayphp json字符串对象到php数组
【发布时间】:2014-04-15 04:18:40
【问题描述】:

我查看了decode a string here 的方法,但是它需要将密钥括在引号中,而我的数据不需要,例如:

以下数据,保存在.txt文件中,我使用file_get_contents()读取文件,我无法控制以下数据。

这是我的数据

"{
    ip : "192.168.1.110",
    startFrame : "1",
    endFrame : "11",
    startedCurrentFrameAt: "1397529891",
    status: "rendering",
    currentFrame: "0"
}"

在 php 中,我希望能够读取这些数据,并访问每个键,这是我尝试过的:

$arr = json_decode($data, true)['status'];

$arr 只返回 null,因为没有引用键,有没有解决方法?

我找到了很多关于这个问题的答案,但都引用了密钥。

【问题讨论】:

  • 您是在生成 JSON 还是从某个地方获取它?
  • 你也可以添加json生成的代码吗?
  • 从 2.2 开始。对象 对象结构表示为一对围绕零个或多个名称/值对(或成员)的花括号。名称是一个字符串。从 2.5 开始。字符串 字符串以引号开始和结束。所以从技术上讲,这些是json不支持的对象。键需要是字符串我的朋友
  • @ShankarDamodaran 我已经编辑了我的问题,我基本上是在阅读一个自动填充数据的 txt 文件。
  • @AwladLiton 我没有生成对象,它是通过我不创建/管理的 .txt 自动拉入的。

标签: php arrays json string


【解决方案1】:

试试这个

<?php
 function fix_json($s) {
  $s = preg_replace('/(\w+):/i', '"\1":', $s);
  return $s;
}


$data = '{
    ip: "192.168.1.110",
    startFrame: "1",
    endFrame: "11",
    startedCurrentFrameAt: "1397529891",
    status: "rendering",
    currentFrame: "0"
}';

$valid_json = fix_json($data);
$arr = json_decode($valid_json , true);
$status = $arr['status'];

echo $status;

DEMO

【讨论】:

  • 请阅读我的整个问题,我无法控制键周围的引号,除非我使用正则表达式添加它们。
  • 我的对象被包裹在 "" 而不是 '' 中,为什么这很重要?它似乎不起作用,除非它是单引号而不是双引号
  • 我最终得到了这个工作,它不起作用,因为我的 datakey : "s" 中有空格,我使用另一个表达式删除了分号前的任何空格,它工作正常
【解决方案2】:

为此使用preg_replace_callback()


那么代码中发生了什么?

首先,正则表达式尝试查找空格和 : 之间的条目,然后连接它们周围的引号。最后,str_replace() 充当包装器来修复 JSON 大括号。

<?php

$json='"{
    ip : "192.168.1.110",
    startFrame : "1",
    endFrame : "11",
    startedCurrentFrameAt: "1397529891",
    status: "rendering",
    currentFrame: "0"
}"';

function cb_quote($v)
{
    return '"'.trim($v[1]).'":';
}
$newJSON=str_replace(array('"{','}"'),array('[{','}]'),preg_replace_callback("~ (.*?):~","cb_quote", $json));
echo $arr = json_decode($newJSON, true)[0]['status'];

OUTPUT :

rendering

Working Demo

通过文件..(编辑)

<?php
$json = trim(file_get_contents('new.txt'));
//Modifications..
$json = str_replace(array('{','}',':',','),array('[{" ',' }]','":',',"'),$json);
function cb_quote($v)
{
    return '"'.trim($v[1]).'"';
}
$newJSON=preg_replace_callback("~\"(.*?)\"~","cb_quote", $json);
echo $arr = json_decode($newJSON, true)[0]['status']; //"prints" rendering

【讨论】:

  • 我仍然得到空值,我不能像你一样定义 $json 变量,尝试复制,我可以写这个$json = "'" . $data ."'"; ??
  • 如果您是从文本文件中获取的,只需执行...$json = trim(file_get_contents('yourjsonfile.txt'));
  • newJSON 已定义,但如果我像这样返回$arrreturn json_decode($newJSON, true); 它为空...
  • 你到底为什么要使用return?你在function 里面还是什么?
  • 我相信我的字符串格式错误,我刚刚在 newJSON 中看到它的格式如下:"{ip"":""192.168.1.110",startFrame":""1",endFrame":""11",startedCurrentFrameAt":""1397529891",status":""rendering",currentFrame":""0"}"
【解决方案3】:

我会使用PHP explode 函数来做到这一点。 Explode 就像 javascript 的 .split 函数,它会接受一个字符串并将其 EXPLODE 到一个可用数据的数组中。

所以,这样的事情应该可以工作,但你需要先删除两端的“{和}”:

// lets assume that your data is $mydata, for brevity's sake.
$mydata_arr = new Array();
$item_arr = new Array();
$newdata_arr = new Array();

$mydata_arr = explode(',',$mydata); // explode where there is a comma

foreach($item in $mydata_arr){
    $item_arr = explode(':',$item); // explode where there is a colon
    // this gives us keys and values in a the $item_arr at [0] and [1]
    $key = $item_arr[0];
    $value = $item_arr[1]; 

    // reassign these in a new, usable array     
    $newdata_arr[$key] = $value;
}

现在,我知道这是粗略和不雅的,但我想以一种可以帮助您了解需要用英语做什么的方式来解释。希望对你有帮助。

【讨论】:

  • 我不知道在哪里,但我相信某处有错误,我无法让它工作:(
  • 您是否删除了开始和结束位?那会搞砸的。
猜你喜欢
  • 2013-03-29
  • 2012-03-25
  • 2019-10-03
  • 2015-10-15
  • 1970-01-01
  • 2014-04-25
  • 2013-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多