亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將高度嵌套的 php 數組/對象編碼為 JSON?

如何將高度嵌套的 php 數組/對象編碼為 JSON?

PHP
莫回無 2022-12-23 16:40:38
注意:這似乎很長,這里有一個簡短的解釋,供那些不想(或不需要)看到我下面所有長解釋的人使用。如果我在這里放了太多東西,我很抱歉,但我認為提供太多信息比提供太少信息要好。簡而言之,我有一個充滿對象的 JS 數組。這些對象的一些屬性是數組。這些數組是對象,里面有數組,里面有對象??偠灾?,有 5 層嵌套。JavaScript 的 JSON.parse/stringify 在這些方面工作得很好,但是當開始讓這個程序在服務器上工作時,我使用 JavaScript 的 JSON.stringify 發送一些數據并使用 php 的 json_decode 來讀取它。php 擺弄數據,用它來編輯大對象(以 JSON 格式存儲在服務器上的 txt 文件中)。像 addMessage 和 createRoom 這樣的小函數可以工作,但是當我嘗試發送一個 3 級對象時它不起作用。我認為問題可能與嘗試上傳字符串化對象有關,因為我的其他 php 腳本接收參數,然后從這些參數創建對象為 stdClass。長無聊版:這個問題似乎在其他地方的變體中被問到,但我找不到適合我的答案?;旧?,我正在開發一個在線交互式白板程序。它使用 JS 作為主要語言和 PHP 來完成所有的文件編寫工作。我使用 json_encode 將數據存儲在 .txt 文件中。為了從文件中讀取數據,我的 JS 調用我的 php,它解碼文件、獲取相關數據、對其進行編碼并回顯。所有的數據都是由 JS 生成的,并且是面向被 JS 編輯的——所有的數據都是由 JS Classes 構建的。到目前為止,我的程序運行良好,加入/創建白板和聊天功能相對簡單。當我嘗試實現跨計算機白板同步時,我發現當我將新的白板數據發送到php并嘗試將其放入文件時,json_encode 失敗。我從 Apache 日志中收到此錯誤:PHP Recoverable fatal error:  Object of class stdClass could not be converted to string.它沒有停止程序,而是繼續并破壞數據文件(可能需要在那里進行一些檢查)并殺死整個程序。這就是我的數據結構的工作方式(在 JS 中,如果我對其進行硬編碼,它將是這樣):[ /* list of room objects */    { /* a room object */        name: 'example',         id: 'numbers',         whiteboardData: [           { /* a shape object */            color: [r, g, b],            pointList: [                { /* a vector object*/                    x: 100,                    y: 100,                }                /* heaps of other vector objects */            ]            }        ], /* end of whiteboardData */        chatMessages: [            { /* a message object */                sender: 'username',                content: 'hi'            }            /* heaps of other message objects */        ]    }    /* heaps of other room objects */]
查看完整描述

1 回答

?
犯罪嫌疑人X

TA貢獻2080條經驗 獲得超4個贊

那里的噪音太多了,我無法輕松地看出問題所在。


我不會嘗試推理出來,而是向您展示一個解決方案,它接收數據就像您硬編碼它一樣,向whiteboardData數組添加一個新元素,然后再返回它。我希望使用 fetch 而不是舊的 XMLHttpRequest,但我有點生疏了。這對我來說更容易。


HTML

<!doctype html>

<html>

<head>

<script>

"use strict";

function byId(id){return document.getElementById(id)}

window.addEventListener('load', onLoaded, false);


var jsonObj = 

[ /* list of room objects */

    { /* a room object */

        name: 'example', 

        id: 'numbers', 

        whiteboardData: [

            { /* a shape object */

            color: [100, 150, 100],

            pointList: [

                { /* a vector object*/

                    x: 100,

                    y: 100,

                }

                /* heaps of other vector objects */

            ]

            }

        ], /* end of whiteboardData */

        chatMessages: [

            { /* a message object */

                sender: 'username',

                content: 'hi'

            }

            /* heaps of other message objects */

        ]

    }

    /* heaps of other room objects */

];


function ajaxPostFormData(url, formData, onSuccess, onError)

{

    var ajax = new XMLHttpRequest();

    ajax.onload = function(){onSuccess(this);}

    ajax.onerror = function(){onError(this);}

    ajax.open("POST",url,true);

    ajax.send(formData);

}


function onLoaded(evt)

{

    let fd = new FormData();

    fd.append('whiteboardData', JSON.stringify(jsonObj) );

    ajaxPostFormData('blahBlah.php', fd, function(ajax){console.log(ajax.responseText)}, function(){} );

}

</script>

</head>

<body>

</body>

</html>

PHP

<?php

// blahBlah.php

    var_dump($_POST['whiteboardData']);


    $jsonObj = json_decode( $_POST['whiteboardData'] );


    $newObj = new wbData(200,300,200, [new vec2d(0,0), new vec2d(10,10), new vec2d(100,100)] );


    // append the new stuff

    $jsonObj[0]->whiteboardData[] = $newObj;


    var_dump( json_encode($jsonObj) );


//-----------------------------------

    class wbData

    {

        public function __construct ($r,$g,$b, $pts=[])

            {

                $this->color = [$r, $g, $b];

                //$this->pointList = [];

                $this->pointList = $pts;

            }

    };


    class vec2d

    {

        public function __construct($x=0, $y=0)

        {

            $this->x = $x;

            $this->y = $y;

        }

    }

?>

結果在控制臺

string(164) "[{"name":"example","id":"numbers","whiteboardData":[{"color":[100,150,100],"pointList":[{"x":100,"y":100}]}],"chatMessages":[{"sender":"username","content":"hi"}]}]"

string(250) "[{"name":"example","id":"numbers","whiteboardData":[{"color":[100,150,100],"pointList":[{"x":100,"y":100}]},{"color":[200,300,200],"pointList":[{"x":0,"y":0},{"x":10,"y":10},{"x":100,"y":100}]}],"chatMessages":[{"sender":"username","content":"hi"}]}]"



查看完整回答
反對 回復 2022-12-23
  • 1 回答
  • 0 關注
  • 84 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號