【问题标题】:How to return a valid JSON object?如何返回一个有效的 JSON 对象?
【发布时间】:2016-01-30 23:33:55
【问题描述】:

我刚刚进入 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","viet_performer":"","english_performer":"","viet_event ":"","english_event":"春节 音乐","day":0,"stage":1} {"image_link":"schedule_music.jpg","start_time":"11:00","end_time":"12:00","viet_performer":"","english_performer":"","viet_event":" Nh?c","english_event":"Music","day":1,"stage":0}

//再重复一次

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

我想像这样生成一个有效的 JSON:

[{"image_link":"schedule_music.jpg","start_time":"17:00","end_time":"18:30","viet_performer":"","english_performer":""," viet_event":"","english_event":"春节 音乐","day":0,"stage":1},{"image_link":"schedule_music.jpg","start_time":"11:00","end_time":"12:00","viet_performer" :"","english_performer":"","viet_event":"Nh?c","english_event":"Music","day":1,"stage":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": ""
    }
]

【问题讨论】:

    标签: php json


    【解决方案1】:

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

    $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_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]);
    

    【讨论】:

    • 这不会产生我需要的结果。这会将每个 json 对象包装到一个数组中,例如 [{"image_link":"schedule_huong_sy_nhan.jpg","start_time":"13:30","end_time":"14:00","viet_performer":"","english_performer":"Huong Sy Nhan","viet_event":"","english_event":"Singing","day":2,"stage":0}][{"image_link":"schedule_unknown.png","start_time":"21:00","end_time":"","viet_performer":"","english_performer":"","viet_event":"","english_event":"End of Festival","day":2,"stage":1}]。注意括号。但是,我希望它像预期的输出一样......除非我不明白。
    • 如果有帮助,我希望它在此处的解决方案中显示:stackoverflow.com/questions/22326273/…
    • @Pangu 除非我遗漏了什么,否则我仍然认为这是您正在寻找的解决方案。我添加了一个额外的例子来澄清。
    • 这是我添加的: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]]); 但是,这不会产生与我提供的更清晰示例相同的输出。
    • @Pangu 您期望的输出包含两个对象。你只是通过了一个。请参阅我的第二个示例。
    【解决方案2】:

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

    $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);
    

    【讨论】:

      猜你喜欢
      • 2015-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-18
      • 1970-01-01
      • 2013-05-02
      • 2013-12-29
      相关资源
      最近更新 更多