php转类json格式的数据(没有双引号的JSON格式,一般在硬件对接中出现)

代码如下

 

<?php
/**
 * User: 野草哥哥
 * QQ:1456074580@qq.com
 * Date: 2019/1/17
 * Time: 15:35
 */

namespace app\common;


class JsonParser
{
    private static function startsWith($haystack, $needle) {
        return $needle === "" || strpos($haystack, $needle) === 0;
    }
    private static function skip_ws($str, $pos) {
        while($pos < strlen($str) and ctype_space($str[$pos])) {
            $pos += 1;
        }
        return $pos;
    }
    private static function parse_str($str, $pos, $allow_ws=False, $delimiter=[',',':','}',']']){
        while($pos < strlen($str)){
            if(!$allow_ws && ctype_space($str[$pos])){
                break;
            }
            if(in_array($str[$pos],$delimiter) ){
                break;
            }
            $pos += 1;
        }
        return $pos;
    }
    private static function parse_obj($str, $pos){
        $obj = [];
        while (True) {
            $pos = self::skip_ws($str, $pos + 1);
            $end = self::parse_str($str, $pos, True, [':']);
            if ($end >= strlen($str)) {
                return "unexpected end when parsing object key";
            }
            $key = substr($str, $pos, $end - $pos);
            $pos = self::skip_ws($str, $end + 1);
            if ($pos >= strlen($str)) {
                return "unexpected end when parsing object key";
            }
            if ($str[$pos] == '[') {
                $res = self::parse_array($str, $pos);
                $value = $res['arr'];
                $pos = $res['pos'];
            } elseif ($str[$pos] == '{') {
                $res = self::parse_obj($str, $pos);
                $value = $res['obj'];
                $pos = $res['pos'];
            } else {
                $end = self::parse_str($str, $pos, True, [',', '}']);
                if ($end >= strlen($str)) {
                    return "unexpected end when parsing object key";
                }
                $value = substr($str, $pos, $end - $pos);
                $pos = $end;
            }
            $obj[$key] = $value;
            $pos = self::skip_ws($str, $pos);
            if ($pos >= strlen($str)) {
                return "unexpected end when parsing object key";
            }
            if ($str[$pos] == "}") {
                return ['obj' => $obj, 'pos' => $pos + 1];
            }
        }
    }

    private static function parse_array($str, $pos){
        $arr = [];
        while (True) {
            $pos = self::skip_ws($str, $pos + 1);
            if ($pos >= strlen($str)) {
                return "unexpected end when parsing object key";
            }
            if ($pos >= strlen($str)) {
                return "unexpected end when parsing object key";
            }
            if ($str[$pos] == "[") {
                $res = self::parse_array($str, $pos);
                $value = $res['arr'];
                $pos = $res['pos'];
            } elseif ($str[$pos] == "{") {
                $res = self::parse_obj($str, $pos);
                $value = $res['obj'];
                $pos = $res['pos'];
            } else {
                $end = self::parse_str($str, $pos, True, [',', ']']);
                if ($end >= strlen($str)) {
                    return "unexpected end when parsing object key";
                }
                $value = substr($str, $pos, $end - $pos);
                $pos = $end;
            }
            array_push($arr, $value);
            $pos = self::skip_ws($str, $pos);
            if ($pos >= strlen($str)) {
                return "unexpected end when parsing object key";
            }
            if ($str[$pos] == "]") {
                return ['arr' => $arr, 'pos' => $pos + 1];
            }
        }
    }
    #
    public static function parse($str) {
        if(!self::startsWith($str,"json")){
            return ["error_code"=>1,"msg"=>"请以【json:】开头"];
        };
        $pos = strpos($str, ':');
        if(empty($pos)){
            return false;
        }
        $pos = self::skip_ws($str, $pos+1);
        if($str[$pos] == '{'){
            return self::parse_obj($str,$pos)['obj'];
        }
        if($str[$pos] == '['){
            return self::parse_array($str,$pos)['arr'];
        }
    }
}

测试:

function test(){
    $str="json:{name:张三,age:22,book:[{bookname:语文,booksize:200,soce:100},{wkke:123}]}";
    $str = JsonParser::parse($str);
    echo json_encode($str);
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值