Json空数组json_decode

时间:2017-05-07 11:16:28

标签: php arrays json string decode

我有以下代码将json转换为数组:

$str = file_get_contents('http://localhost/data.json');
$decodedstr = html_entity_decode($str);
$jarray = json_decode($decodedstr, true);


echo "<pre>";
print_r($jarray);
echo "</pre>";

但我的$jarray一直在返回null ...我不知道为什么会发生这种情况..我已经在这个问题中验证了我的json: validated json question任何人都可以告诉我我做错了什么?或者发生了什么。提前谢谢。

当我回复我的$ str时,我得到以下内容:image of echo of $str

2 个答案:

答案 0 :(得分:1)

您传递的json_decode字符串无效JSON ,这就是NULL返回的原因。

正如我在评论中看到的那样,检查生成的错误代码会提供与常量4对应的JSON_ERROR_SYNTAX,这意味着JSON字符串具有语法错误

(见http://php.net/manual/en/function.json-last-error.php

您应该检查(回显)从

获得的内容
$str = file_get_contents('http://localhost/data.json');

(您可以编辑答案并发布 - 或者部分内容)

确定它无效JSON;问题在于:data.json

然后,当您修复问题并从data.json获得预期时,我将确保您确实需要对获取的数据使用html_entity_decode

这会很奇怪&#34;使用html编码的JSON数据。

<强>更新

看看你从data.json得到的东西,JSON数据似乎包含实际的HTML实体(因为我看到&nbsp; s的存在)

这实际上很奇怪,正确的做法是修复如何生成data.json,确保返回非html编码 JSON数据,charset为UTF-8和响应内容类型为Content-Type: application/json

我们无法在此深化这一点,因为我不知道data.json来自哪里或生成它的代码。最后你可以发布另一个答案。

所以这是一个快速修复,前提是正确的方法将是我刚刚建议的。

在解码html实体时,非中断空格&nbsp;变为2字节UTF-8字符(字节值196,160),对于JSON编码数据无效

想法是删除这些字符;你的代码变成了:

$str = file_get_contents('http://localhost/data.json');
$decodedstr = html_entity_decode($str);

// the character sequence for decoded HTML &nbsp;
$nbsp = html_entity_decode( "&nbsp;" );

// remove every occurrence of the character sequence
$decodedstr = str_replace( $nbsp, "", $decodedstr );

$jarray = json_decode($decodedstr, true);

答案 1 :(得分:0)

来自php手册

http://php.net/manual/en/function.json-decode.php

<强>返回

  

... API().getTrips(params) .observeOn(AndroidSchedulers.mainThread()) .doOnRequest((Long request) -> dummyView.setVisibility(View.VISIBLE)) .doOnCompleted(() -> createListView()) .doOnNext(response -> getTrips(response.body().getData())) .flatMap(getTripsModel -> Observable.from(getTripsModel.body().getData().getTrips())) .flatMap(tripsModel -> Observable.from(tripsModel.getSubTrips())) /******** ** at some point here I need to insert the ** IntermediateStops into the SubTripsModel *********/ .flatMap(subTripsModel -> API().getIntermediateStops( subTripsModel.getIntermediateStops(), Token.getInstance().TOKEN)) .doOnCompleted(() -> dummyView.setVisibility(View.GONE)) .subscribe(intermediateResponse -> { }, throwable -> { Log.i("REST ERROR", RestErrorHelper.getErrorMessage(throwable, mContext)); });

因此,传递给NULL is returned if the json cannot be decoded or if the encoded data is deeper than the recursion limit的JSON字符串无效:

可能是因为json_decode()