【问题标题】:how to read json from database如何从数据库中读取json
【发布时间】:2018-07-24 15:28:25
【问题描述】:

我在数据库中有json字符串

{"api":[{"caseid":2,"fullname":"df","businessname":"asdf","phonenumber":"12345678","activity":"sdf","province":7,"wilayat":"adfasd","description":"sfasdf","casedate":"2018-02-08 11:39:19"},{"caseid":3,"fullname":"\u0646\u0648\u0631\u062e\u0627\u0646 \u062a\u0627\u062a\u0627\u0631\u064a","businessname":"\u0627\u0644\u0631\u0641\u062f","phonenumber":"98818663","activity":"\u0646\u0649\u0633 \u064a\u0634\u064a \u0647\u062e\u0634 \u0645\u062a \u0634\u064a\u0628\u0634\u0633","province":1,"wilayat":"\u0627\u0644\u0633\u064a\u0628","description":"\u0648\u0635\u0641 \u0627\u0644\u0634\u0643\u0648\u064a","casedate":"2018-02-08 12:14:24"},{"caseid":4,"fullname":"test","businessname":"asdf","phonenumber":"12345678","activity":"asdfas","province":3,"wilayat":"dfasdf","description":"fsdfasdfasdf","casedate":"2018-02-08 12:24:53"},{"caseid":5,"fullname":"\u0645\u062d\u0645\u062f \u0627\u0633\u0644\u0627\u0645","businessname":"\u0635\u0646\u062f\u0648\u0642 \u0627\u0644\u0631\u0641\u062f","phonenumber":"98818663","activity":"\u0649\u0646 \u0633\u0634 \u0646\u062e \u0645\u0643 \u0648\u0646\u062e \u0635\u062e\u0636 \u062d\u062e\u0634","province":1,"wilayat":"\u0627\u0644\u0633\u064a\u0628","description":"\u0634\u0628 \u0634\u0633\u064a\u0628 \u0634\u0633\u064a\u0628 \u0634\u0633\u0628 \u062b\u0636\u0635  \u0631\u062b\u0631\u062b \u0631\u062b\u0631\u0631 \u0629\u0645 \u0629\u0648\u0648 \u0646\u0646\u062e\u062d","casedate":"2018-02-12 11:23:38"},{"caseid":6,"fullname":"\u0641\u0647\u062f \u0627\u0644\u062d\u0627\u0631\u062b\u064a","businessname":"\u062a\u062c\u0631\u0628\u0629 \u0627\u0644\u0646\u0638\u0627\u0645 ","phonenumber":"95871817","activity":"\u0644\u0627 \u064a\u0648\u062c\u062f ","province":1,"wilayat":"\u0627\u0644\u0633\u064a\u0628 ","description":"\u062a\u062c\u0631\u0628\u0629 1 ","casedate":"2018-02-13 13:40:51"}]}

$apiContent 有上面的 json 字符串

$apiContent = $this->db->from("users_api")->get()->row()->apicontent;

当我写 echo $apiContent 时,它显示了整个字符串,但是当我尝试解码 json 字符串时,它什么也没显示

print_r(json_decode($apiContent, TRUE));

这是我的全部功能

function saveImportComplaint($xp)
{       
        $apiContent = $this->db->from("users_api")->get()->row()->apicontent;               
        return json_decode($apiContent, TRUE);      
}

添加 makejsonsafe 函数后,我可以读取和转换 json,由于 unicode 值而出现错误

function makejsonsafe($myjsonstring)
{
    for ($i = 0; $i <= 31; ++$i) 
    {
        $myjsonstring = str_replace(chr($i), "", $myjsonstring);
    }
    $myjsonstring = str_replace(chr(127), "", $myjsonstring);
    if (0 === strpos(bin2hex($myjsonstring), 'efbbbf')) 
    {
        $myjsonstring = substr($myjsonstring, 3);
    }
    $myjsonstring = json_decode( $myjsonstring );
    return $myjsonstring;
}

【问题讨论】:

  • AGAIN? ?
  • @Butuzov 现在我在数据库中添加了我的 json 字符串
  • @MuhammedImranHussain 现在情况不同了
  • 不清楚您的代码为什么不起作用。告诉我们:$apiContent。有些事情你没有告诉我们。

标签: php json codeigniter


【解决方案1】:

看起来你正在处理:

  1. 字节顺序标记
  2. 可能还有一些 unicode / 零宽度字符

没有看到您的实际输入字符串,我无法自信地编写完美的模式或测试我的代码,但我的方法应该可以完成您发布的解决方法...

function makejsonsafe($myjsonstring){
    return json_decode(preg_replace('/[\x00-\x1F\x7F]|^\xEF\xBB\xBF/u','',$myjsonstring));
    // return the data as an object
}

模式细分:

[                #start character class
    \x00-\x1F    #match range between "null" and "unit separator"
    \x7F         #match "delete"
]                #end character class
|                #or
^\xEF\xBB\xBF    #match your BOM at start of string

话虽如此,较短的模式可能会起到同样的作用:

\p{Cc}[\x00-\x1F\x7F] 相同,所以你可以使用:/\p{Cc}|^\xEF\xBB\xBF/u

\P{C} 将只针对可打印字符,因此您可以使用相反的:/\p{C}+/u

参考资料:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-26
    • 2020-08-14
    • 2011-04-26
    • 1970-01-01
    • 2023-03-28
    • 2016-10-18
    • 1970-01-01
    相关资源
    最近更新 更多