Php 如何返回有效的JSON对象?

Php 如何返回有效的JSON对象?,php,json,Php,Json,我刚开始学习php,我遇到了一个返回JSON对象的问题 代码如下: $stmt->bind_result($image_link, $start_time, $end_time, $viet_performer, $english_performer, $viet_event, $english_event, $day, $stage); while($stmt->fetch()) { echo jso

我刚开始学习php,我遇到了一个返回JSON对象的问题

代码如下:

$stmt->bind_result($image_link, $start_time, $end_time, $viet_performer, $english_performer, $viet_event, $english_event, $day, $stage);

            while($stmt->fetch())
            {
                echo json_encode([["image_link" => $image_link,"start_time" => $start_time, "end_time" => $end_time, "viet_performer" => $viet_performer,
                                "english_performer" => $english_performer, "viet_event" => $viet_event, "english_event" => $english_event, "day" => $day,
                                "stage" => $stage]]);

                $stmt->bind_result($image_link, $start_time, $end_time, $viet_performer, $english_performer, $viet_event, $english_event, $day, $stage);
            }
这基本上产生了:

{“image_link”:“schedule_music.jpg”,“start_time”:“17:00”,“end_time”:“18:30”,“Vietu performer”:“english_performer”:“Vietu event”:“english_event”:“Tet” 音乐,“日”:0,“舞台”:1} {“image_link”:“schedule_music.jpg”,“start_time”:“11:00”,“end_time”:“12:00”,“Vietu performer”:“english_performer”:“Vietu event”:“Nh?c”,“english_event”:“music”,“day”:1,“stage”:0}

//重复一遍

然而,根据JSON验证器,它是一个无效的JSON对象

我希望生成一个有效的JSON,如下所示:

[{“图像链接”:“schedule_music.jpg”,“开始时间”:“17:00”,“结束时间”:“18:30”,“越南表演者”:“英语表演者”:“越南活动”:“英语活动”:“春节” 音乐,“日”:0,“舞台”:1},{“图像链接”:“日程安排”Music.jpg,“开始时间”:“11:00”,“结束时间”:“12:00”,“越南表演者”:“英语表演者”:“越南活动”:“Nh?c”,“英语活动”:“音乐”,“日”:1,“舞台”:0}]

请注意开始/结束括号以及逗号分隔符

我怎样才能做到这一点

下面是一个更好的示例(可以在某处找到),说明了我的输出类似的样子:

{
    "id": "a1",
    "session": "General",
    "name": "Exhibitor Setup Begins",
    "startTime": "0900",
    "details": "9am Exhibitor Hall",
    "png": "image",
    "speaker1": "Johnson",
    "speaker2": "Nelson",
    "speaker3": ""
}{
    "id": "b1",
    "session": "General",
    "name": "Conference Registration",
    "startTime": "1000",
    "details": "10am Noon Upper Level Lobby",
    "png": "image",
    "speaker1": "Jackson",
    "speaker2": "",
    "speaker3": ""
}
以及我希望输出是什么样子的:

[
    {
        "id": "a1",
        "session": "General",
        "name": "Exhibitor Setup Begins",
        "startTime": "0900",
        "details": "9am Exhibitor Hall",
        "png": "image",
        "speaker1": "Johnson",
        "speaker2": "Nelson",
        "speaker3": ""
    },
    {
        "id": "b1",
        "session": "General",
        "name": "Conference Registration",
        "startTime": "1000",
        "details": "10am Noon Upper Level Lobby",
        "png": "image",
        "speaker1": "Jackson",
        "speaker2": "",
        "speaker3": ""
    }
]

关于更新后的代码,问题在于您要单独编码每个片段,而不是一次编码所有数据。试试这个:

$stmt->bind_result($image_link, $start_time, $end_time, $viet_performer, $english_performer, $viet_event,
    $english_event, $day, $stage);

$data = [];
while ($stmt->fetch()) {
    $data[] = [
        "image_link"        => $image_link,
        "start_time"        => $start_time,
        "end_time"          => $end_time,
        "viet_performer"    => $viet_performer,
        "english_performer" => $english_performer,
        "viet_event"        => $viet_event,
        "english_event"     => $english_event,
        "day"               => $day,
        "stage"             => $stage
    ];
}

echo json_encode($data);

根据问题的早期版本作出的答复:

看起来您需要一个对象数组:

echo json_encode([
    [
        "image_link"        => $image_link,
        "start_time"        => $start_time,
        "end_time"          => $end_time,
        "viet_performer"    => $viet_performer,
        "english_performer" => $english_performer,
        "viet_event"        => $viet_event,
        "english_event"     => $english_event,
        "day"               => $day,
        "stage"             => $stage
    ]
]);
请注意,包含字符串键的数组将通过
json\u encode
转换为对象。在上面的代码中,内部数组成为对象,而外部数组则不是


这可能是一种更直观的方式:

$objectOne = (object) [
    "image_link"        => $image_link,
    "start_time"        => $start_time,
    "end_time"          => $end_time,
    "viet_performer"    => $viet_performer,
    "english_performer" => $english_performer,
    "viet_event"        => $viet_event,
    "english_event"     => $english_event,
    "day"               => $day,
    "stage"             => $stage
];

$objectTwo = (object) [
    "image_link"        => $image_link,
    "start_time"        => $start_time,
    "end_time"          => $end_time,
    "viet_performer"    => $viet_performer,
    "english_performer" => $english_performer,
    "viet_event"        => $viet_event,
    "english_event"     => $english_event,
    "day"               => $day,
    "stage"             => $stage
];

echo json_encode([$objectOne, $objectTwo]);

关于更新后的代码,问题在于您要单独编码每个片段,而不是一次编码所有数据。试试这个:

$stmt->bind_result($image_link, $start_time, $end_time, $viet_performer, $english_performer, $viet_event,
    $english_event, $day, $stage);

$data = [];
while ($stmt->fetch()) {
    $data[] = [
        "image_link"        => $image_link,
        "start_time"        => $start_time,
        "end_time"          => $end_time,
        "viet_performer"    => $viet_performer,
        "english_performer" => $english_performer,
        "viet_event"        => $viet_event,
        "english_event"     => $english_event,
        "day"               => $day,
        "stage"             => $stage
    ];
}

echo json_encode($data);

根据问题的早期版本作出的答复:

看起来您需要一个对象数组:

echo json_encode([
    [
        "image_link"        => $image_link,
        "start_time"        => $start_time,
        "end_time"          => $end_time,
        "viet_performer"    => $viet_performer,
        "english_performer" => $english_performer,
        "viet_event"        => $viet_event,
        "english_event"     => $english_event,
        "day"               => $day,
        "stage"             => $stage
    ]
]);
请注意,包含字符串键的数组将通过
json\u encode
转换为对象。在上面的代码中,内部数组成为对象,而外部数组则不是


这可能是一种更直观的方式:

$objectOne = (object) [
    "image_link"        => $image_link,
    "start_time"        => $start_time,
    "end_time"          => $end_time,
    "viet_performer"    => $viet_performer,
    "english_performer" => $english_performer,
    "viet_event"        => $viet_event,
    "english_event"     => $english_event,
    "day"               => $day,
    "stage"             => $stage
];

$objectTwo = (object) [
    "image_link"        => $image_link,
    "start_time"        => $start_time,
    "end_time"          => $end_time,
    "viet_performer"    => $viet_performer,
    "english_performer" => $english_performer,
    "viet_event"        => $viet_event,
    "english_event"     => $english_event,
    "day"               => $day,
    "stage"             => $stage
];

echo json_encode([$objectOne, $objectTwo]);

正确的方法是先生成数据结构,然后对其进行编码:

$foo = [];
while($stmt->fetch()) {
    $foo []= [
         "image_link" => $image_link,
         "start_time" => $start_time,
         "end_time" => $end_time,
         "viet_performer" => $viet_performer,
         "english_performer" => $english_performer,
         "viet_event" => $viet_event,
         "english_event" => $english_event,
         "day" => $day,
         "stage" => $stage];
    ];
}
$json = json_encode($foo);

正确的方法是先生成数据结构,然后对其进行编码:

$foo = [];
while($stmt->fetch()) {
    $foo []= [
         "image_link" => $image_link,
         "start_time" => $start_time,
         "end_time" => $end_time,
         "viet_performer" => $viet_performer,
         "english_performer" => $english_performer,
         "viet_event" => $viet_event,
         "english_event" => $english_event,
         "day" => $day,
         "stage" => $stage];
    ];
}
$json = json_encode($foo);

这不会产生我需要的结果。这将把每个json对象包装到一个数组中,如so
[{“image\u link”:“schedule\u huong\u sy\u nhan.jpg”,“start\u time”:“13:30”,“end\u time”:“14:00”,“Vietu performer”:“english\u performer”:“huong sy nhan”,“Vietu event”:“english\u event”:“sing”,“day”:“stage”:0}[{“image\u link”:“schedule\u unknown.png.png”,“start\u time”:“21:00”,“end\u time”:,“越南表演者”:“英语表演者”:“越南活动”:“英语活动”:“节日结束”,“日期”:2,“舞台”:1}]
。注意括号。但是,我希望它与预期的输出一样……除非我不理解。如果有帮助,我希望它如这里的解决方案所示:@Pangu除非我遗漏了什么,否则我仍然认为这是您正在寻找的解决方案。我添加了一个额外的示例来澄清。这就是我添加的:
echo json_编码([[“图像链接”=>$image_链接,“开始时间”=>$start_时间,“结束时间”=>$end_时间,“越南表演者”=>$Vietu表演者”,“英语表演者”=>$english_表演者”,“越南事件”=>$Vietu事件,“英语事件”=>$english_事件”,“日”=>$day,“舞台”=>$stage])
但是,这不会产生与我提供的更清晰的示例相同的输出。@Pangu您期望的输出包含两个对象。您只传递了一个。请参见我的第二个示例。这不会产生我需要的结果。这会将每个json对象包装到一个数组中,就像这样
[{“image\u link”:“schedule\u huong sy nhan.jpg”,“start\u time”“:“13:30”,“结束时间”:“14:00”,“越南表演者”:“英语表演者”:“Huong Sy Nhan”,“越南事件”:“英语表演者”:“歌唱”,“日”:2,“舞台”:0}][{“图像链接”:“日程未知.png”,“开始时间”:“21:00”,“结束时间”:“越南表演者”:“英语表演者”:“越南事件”:“英语表演者”:“节日结束”,“日”:2,“舞台”:1}
。请注意括号。但是,我希望它能像预期的输出一样……除非我不理解。如果它有帮助,我希望它能像这里的解决方案所示:@Pangu除非我遗漏了什么,否则我仍然认为这是您正在寻找的解决方案。我添加了一个额外的示例来澄清。这就是我添加的:
echo json\u编码([[“图像链接”=>$image\u链接,“开始时间”=>$start\u时间,“结束时间”=>$end\u时间,“越南表演者”=>$Vietu表演者,“英语表演者”=>$english\u表演者”,“越南事件”=>$Vietu事件,“英语事件”=>$english\u事件”=>$english\u事件,“day”=>$day,“stage”=>$stage]];但是,这不会产生与我提供的更清晰的示例相同的输出。@Pangu预期的输出包含两个对象。你只通过了一个。参见我的第二个示例。