在数据库中读出数据组成json格式,如何实现用递归的方式实现json的拼接

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在数据库中读出数据组成json格式,如何实现用递归的方式实现json的拼接相关的知识,希望对你有一定的参考价值。

[ "name": "qqq", "userid": "34013", "time": "2015/2/11 9:44:22", "receive": "name": "aaa", "userid": "34362", "time": "2015/2/11 9:45:50", "receive": "name": "bbb", "userid": "34484", "time": "2015/2/11 10:08:16" , "name": "mmm", "userid": "34013", "time": "2015/2/11 9:52:18", "receive": "name": "kkk", "userid": "34458", "time": "2015/2/11 10:08:16" ]

我们通常会在服务端拼接json数据返回给客户端,有时我们会采用第一种AppendFormat的方式拼接,这种方法是不行的,json外含有符号 “ ”
,与拼接的占位符的符号冲突0-- “ ” ,故而报输入的字符串格式不正确。
所以我们正确的拼接方式是Append的方式。
参考技术A 你的表结构是咋样的?追问

是多表查询的

追答

你不给表字段,怎么写查询语句?最后一次问你了。

追问

表字段是:name,userid,time;每级都可能有第二级,依次循环,老大叫写出来,可是小妹真的写不出来,谢谢

追答

菜鸟就是菜鸟,该给的没给,我也懒得问了,我假设消息表结构为,name,userid,time,reid

reid表示接收者的id,那么表数据就类似这样,
name, userid, time, reid
qqq, 34013, 2015/2/11 9:44:22, 34362

aaa, 34362, 2015/2/11 9:45:50, 34484

....
算法步骤,
1将数据的层级关系转为数组的维数关系
2将数组转为json数据
$arr = get_category();//将数据变为数组格式
$json = arr_to_json($arr);//将数组变为json数组,所有语言都会提供这种函数的。
代码用php写的,你懂不懂都算了
function get_category($re_id=0,$flag=true)
$arr=array();
if($flag)
$sql = "select * from message a left join message b on a.userid=b.reid where b.userid is NULL";//查询第一级的数据,也就是userid没有在reid中出现过的数据
else
$sql = "select * from message where userid=$re_id";//查询子级数据

$result = array(a_object,b_object,,,)=sql_query($sql);//查询结果一个数组或列表格式
if($result)
foreach($result as $re)//循环数组
if(get_category($re.reid,false))//如果子级不为空
$re['receive'] = get_category($re.reid,false);
$arr[] = $re;

return $arr;

递归格式化JSON数据

要求:

有一个key=>value格式的数据,现在需要格式化将其输出,以key=value的形式输出,两个key=value直接用分号;隔开,如果value是数组的话,输出格式是这样的:key.item=value

例子:

{
    "person":{
        "name":"pig",
        "age":"18",
        "sex":"man",
        "hometown":{
            "province":"江西省",
            "city":"抚州市",
            "county":"崇仁县"
        }
    }
}

 

输出:

person.name=pig;person.age=18;person.sex=man;person.hometown.province=江西省;person.hometown.city=抚州市;person.hometown.county=崇仁县

 

分析:

由于是不确定层级的数据,所以普通的两个或者多个for循环遍历肯定是行不通的,这里考虑使用递归的方式进行处理

 

核心代码:

<?php
class Demo {
    public function printArray(array $data)
    {
        $result = $this->formatArray($data);
        echo substr($result, 0, -1);
    }

    public function formatArray($data, $prefix=‘‘)
    {
        if (is_array($data))
        {
            $result = ‘‘;
            foreach ($data as $key => $value)
            {
                $result .= $this->formatArray($value, empty($prefix)? "$key" : "$prefix.$key");
            }
            return $result;
        }
        else
        {
            return "$prefix=$data;";
        }
    }
}

 

下面用三个层级的数据测试一下:

<?php
$tmp = [
    ‘date‘ => ‘2020-01-01‘,
    ‘name‘ => ‘name‘,
    ‘type‘ => ‘type‘,
    ‘array1‘ => [
        ‘a‘ => ‘1‘,
        ‘b‘ => ‘2‘,
        ‘c‘ => ‘3‘,
    ],
    ‘price‘ => ‘1.0‘,
    ‘sum‘ => ‘2.0‘,
    ‘array2‘ => [
        ‘A‘ => ‘1‘,
        ‘B‘ => ‘2‘,
        ‘C‘ => [
            ‘C1‘ => ‘1‘,
            ‘C2‘ => ‘2‘,
            ‘C3‘ => [
                ‘C3_1‘ => ‘1‘,
                ‘C3_2‘ => ‘2‘,
                ‘C3_3‘ => ‘3‘,
            ],
        ],
    ],
    ‘count‘ => ‘12.0‘,
];

$demo = new Demo(); $demo->printArray($tmp);

 

输出:

date=2020-01-01;name=name;type=type;array1.a=1;array1.b=2;array1.c=3;price=1.0;sum=2.0;array2.A=1;array2.B=2;array2.C.C1=1;array2.C.C2=2;array2.C.C3.C3_1=1;array2.C.C3.C3_2=2;array2.C.C3.C3_3=3;count=12.0

 

总结:

1、由于不确定数据的层级,普通的循环遍历肯定是行不通的,即使知道了数据最多只有3个层次,也最好别写for循环处理,毕竟每一层的for循环你都要判断,代码会非常臃肿而且难维护

2、虽然递归很容易理解,但是也存在一些效率上的问题,这个需要谨慎使用,根据实际的生产环境数据多次测试,再选择合适的处理方法

 

以上是关于在数据库中读出数据组成json格式,如何实现用递归的方式实现json的拼接的主要内容,如果未能解决你的问题,请参考以下文章

json特殊字符都有哪些

怎样在java中查询mysql得到如下的json格式的结果

如何递归地读出 Perl 中的目录?

怎么用C语言获取JSON中的数据?

递归格式化JSON数据

递归格式化JSON数据