【问题标题】:parsing json file in php trouble在php麻烦中解析json文件
【发布时间】:2011-12-12 23:36:14
【问题描述】:

我有这个数据 cennik.json 文件:

{
    "waluta": "PLN",
    "vat": 1.23,
    "00101": {
        "cena": 340,
        "powiazanyZ": "00139"
    },
    "00102": {
        "cena": 325.33,
        "powiazanyZ": "00140"
    },
    "00103": {
        "cena": 306.67,
        "powiazanyZ": "00141"
    },
    "00104": {
        "cena": 289.33,
        "powiazanyZ": "00142"
    },
    "00105": {
        "cena": 276,
        "powiazanyZ": "00143"
    },
    "00106": {
        "cena": 258.67,
        "powiazanyZ": "00144"
    },
    "00107": {
        "cena": 240,
        "powiazanyZ": "00145"
    },
    "00108": {
        "cena": 222.67,
        "powiazanyZ": "00146"
    },
    "00109": {
        "cena": 205.33,
        "powiazanyZ": "00147"
    },
    "00110": {
        "cena": 189.33,
        "powiazanyZ": "00148"
    },
    "00120": {
        "cena": 413.33,
        "powiazanyZ": "00150"
    },
    "00121": {
        "cena": 73.33,
        "powiazanyZ": "00000"
    },
    "00122": {
        "cena": 153.33,
        "powiazanyZ": "00000"
    },
    "00123": {
        "cena": 153.33,
        "powiazanyZ": "00000"
    },
    "00138": {
        "cena": 1937,
        "powiazanyZ": "00152"
    },
    "00139": {
        "cena": 366.82,
        "powiazanyZ": "00101"
    },
    "00140": {
        "cena": 325.33,
        "powiazanyZ": "00102"
    },
    "00141": {
        "cena": 306.67,
        "powiazanyZ": "00103"
    },
    "00142": {
        "cena": 289.33,
        "powiazanyZ": "001041"
    },
    "00143": {
        "cena": 276,
        "powiazanyZ": "00105"
    },
    "00144": {
        "cena": 258.67,
        "powiazanyZ": "00106"
    },
    "00145": {
        "cena": 240,
        "powiazanyZ": "00107"
    },
    "00146": {
        "cena": 222.67,
        "powiazanyZ": "00108"
    },
    "00147": {
        "cena": 205.33,
        "powiazanyZ": "00109"
    },
    "00148": {
        "cena": 189.33,
        "powiazanyZ": "00110"
    },
    "00150": {
        "cena": 413.33,
        "powiazanyZ": "00120"
    },
    "00152": {
        "cena": 1997.33,
        "powiazanyZ": "00138"
    }
}

这来自我的 php 文件:

$vat = 0.00;
$waluta = '';
$kod00101 = 0.00;
$kod00102 = 0.00;
...
$kod00152 = 0.00;

$cennik_plik = file_get_contents("cennik.json");
$jsonIterator = new RecursiveIteratorIterator(
    new RecursiveArrayIterator(json_decode($cennik_plik, TRUE)),
    RecursiveIteratorIterator::SELF_FIRST);

foreach ($jsonIterator as $key => $val) {
    if(is_array($val)) {
        $v = ${'kod'.$key};
        if('$key' == $v){
            $v = number_format((float)$val[cena],2,'.','');
        }
    } else {
        if('$key' == 'waluta') {$waluta = $val;};
        if('$key' == 'vat') {$vat = number_format((float)$val,2,'.','');};
    }
}

我正在尝试这个,我得到以下错误:

致命错误:在 C:\Documents and Settings\user\Desktop\Lighty2Go\HTDOCS\ogr\index.php 中带有消息“传递的变量不是数组或对象,而是使用空数组”的未捕获异常“InvalidArgumentException”: 50
堆栈跟踪:
 #0 C:\Documents and Settings\user\Desktop\Lighty2Go\HTDOCS\ogr\index.php(50): ArrayIterator->__construct('???{?? "walu...')
 #1 {main} 在第 50 行的 C:\Documents and Settings\user\Desktop\Lighty2Go\HTDOCS\ogr\index.php 中抛出

有什么建议吗?

我尝试使用这些资源自己解决它,但没有:

【问题讨论】:

  • 你传入的不是 JSON 数组,所以我不知道你为什么认为 RecursiveArrayIterator 会起作用。
  • 我已经在codepad.org/coNivEDv 上尝试过这段代码,它可以工作,所以我不知道我应该在哪里查找错误
  • 我意识到设置 xdebug 很困难,但是在您在这里提问之前需要进行一些调试。例如,在这种情况下,您需要逐步检查这些值。如果那是echovar_dump,那就这样吧。但是例如你甚至都懒得去检查json_decode()给了你什么。
  • 你是对的。老实说,我不知道如何以及在哪里设置这些东西,我应该从哪里开始寻找错误。我确信我是一些容易修复的错误,因为我是 php 真正的新手,我试图问一个快速的问题。现在,在马里奥的帮助下,我开始明白一些事情了。

标签: php json


【解决方案1】:

我不太确定您正在尝试使用该数据做什么。但你当然不需要那个RecursiveArrayIterator。一个无聊的foreach 就足以遍历那个数组了:

$json = file_get_contents("cennik.json");
# the culprit was the UTF-8 BOM, which OPs specific verison of json_decode tripped over (newer versions would return NULL)
$json = preg_replace('/^\xEF\xBB\xBF/', '', $json);
$array = json_decode($json, TRUE);

var_dump($array);    # <-- WHAT DOES THAT OUTPUT ??


foreach ($array as $key => $value) {

    if ($key == "waluta") {
        $waluta = $value;
    }
    elseif ($key == "vat") {
        $vat = $value;
    }

    // all the data entries
    elseif (is_numeric($key)) {
        $kod[$key] = $value["cena"];
        // ${"kod$key"} = ...;
    }
}

请注意,您可以使用可变变量。但是这个例子尖叫array。我什至不确定为什么要使用单独的变量列表。源数组应该足够好使用。

【讨论】:

  • 我已经尝试过这种方式,但我无法获得分配给变量的值。我试图把 echo "$key => $value\n";进入foreach循环,但没有成功。我收到警告:警告:在第 50 行的 C:\Documents and Settings\user\Desktop\Lighty2Go\HTDOCS\ogr\index.php 中为 foreach() 提供的参数无效
  • 在循环前添加print_r($array);,看看你是否真的得到了数据。
  • 是的,我得到数据:{“waluta”:“PLN”,“vat”:1.23,“00101”:{“cena”:340,“powiazanyZ”:“00139”},“ 00102”:{“cena”:325.33,“powiazanyZ”:“00140”},“00103”:{“cena”:306.67,“powiazanyZ”:......“cena”:413.33,“powiazanyZ”: "00120" }, "00152": { "cena": 1997.33, "powiazanyZ": "00138" } },那么到哪里找问题呢?
  • 添加一个 print_r($array);循环之前和json_decode之后。请准确复制示例。 $array 解码后不能包含 JSON 字符串。
  • 啊,好吧。看的不够仔细。您的 json 文件中有愚蠢的 UTF-8 BOM。这就是您的 json_decode 版本出错的原因(您仍然应该更新您的 PHP 版本)。作为解决方法,您可以使用preg_replace('/^\xEF\xBB\xBF/', '', $str)
猜你喜欢
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
  • 2020-04-10
  • 2011-03-11
  • 1970-01-01
  • 2017-03-15
  • 1970-01-01
相关资源
最近更新 更多