【问题标题】:json_encode with object oriented PHP [closed]json_encode 与面向对象的 PHP [关闭]
【发布时间】:2013-02-23 20:09:20
【问题描述】:

如何在面向对象的 PHP 中使用 json_encode 对以下 json 数据进行编码。

var datasets = {
  "usa": {
    label: "USA",
    data: [[1988, 483994], [1989, 479060], [1990, 457648], [1991, 401949], [1992, 424705], [1993, 402375], [1994, 377867], [1995, 357382], [1996, 337946], [1997, 336185], [1998, 328611], [1999, 329421], [2000, 342172], [2001, 344932], [2002, 387303], [2003, 440813], [2004, 480451], [2005, 504638], [2006, 528692]]
  }

  // skipped other data
}   

我是面向对象的 PHP 和 json 编码的新手,非常感谢您的帮助。

附言。如果可能,请发布脚本的程序编码样式。我只是想和OO比较一下。

【问题讨论】:

  • 我希望这已经是 json 编码的。虽然 json_encode() 和 json_decode() 是相同的函数。
  • 他想对一个对象进行 json 编码以获得这个 json 输出。你没理解 Saurabh 的问题。
  • 请澄清你的意思。您想从此数据构建适当的对象实例/从包含此数据的对象实例以这种格式创建数据吗?或者您只是想在 OOP 上下文中以某种方式使用json_encode?目前的问题没有什么意义/太模糊。
  • 请注意,呈现的这个 JSON 非常奇怪。 javascript 变量被称为“数据集”,这意味着您可以在其中拥有比“美国”更多的对象。但是你没有一个包含“usa”的数组。这会让您很难遍历该 JSON 数据中的所有国家/地区。

标签: php javascript json


【解决方案1】:

您不需要面向对象来做到这一点:

$array = array("usa" => array(
               "label"=>"USA", 
                "data" => array(
                                array("1988","483994"),
                                array("1989","457645") //etc
                          )
                )
          );
 echo json_encode($array);

类似这样的 json 字符串也同样适用:

$string = '{
  "usa": {
    label: "USA",
    data: [[1988, 483994], [1989, 479060], [1990, 457648], [1991, 401949], [1992, 424705], [1993, 402375], [1994, 377867], [1995, 357382], [1996, 337946], [1997, 336185], [1998, 328611], [1999, 329421], [2000, 342172], [2001, 344932], [2002, 387303], [2003, 440813], [2004, 480451], [2005, 504638], [2006, 528692]]
  }

  // skipped other data
}';

print_r(json_decode($string, true)); //Will show you the previous array

php docs

【讨论】:

  • 我猜应该是print_r(json_decode($string, true));反正+1
  • 谢谢,添加了检索关联数组
  • 哦..好像程序风格一点也不差..谢谢~
【解决方案2】:

虽然其他人说您不需要面向对象,但显然您希望尽可能面向对象。而且我认为这是一个好主意,面向对象比大多数 PHP 程序所包含的程序性废话要好得多。

试试这个。

<?php

class DataSet {
    var $label;
    var $data;

    public function __construct($label, $data) {
        $this->label = $label;
        $this->data = $data;
    }
}

class CountryData {
    var $datasets;

    public function __construct() {
        $this->datasets = array();
    }

    public function add($label, DataSet $dataset)
    {
        $this->datasets[$label] = $dataset;
    }
}

$usa = new DataSet('USA', array(
    array(1988, 483994),
    array(1989, 479060)
));

$sweden = new DataSet('Sweden', array(
    array(1981, 1000),
    array(1982, 2000)
));

$result = new CountryData();
$result->add('usa', $usa);
$result->add('sweden', $sweden);

echo json_encode($result);

使用这种方法,您可以将日志记录和其他功能附加到 add 方法等,面向对象的方法增加了更轻松地使用行业标准模式的可能性。

这就是上面代码的输出

{
    "datasets":{
        "usa":{
            "label":"USA",
            "data":[[1988,483994],[1989,479060]]
        },
        "sweden":{
            "label":"Sweden",
            "data":[[1981,1000],[1982,2000]]
        }
    }
}

【讨论】:

  • 您的答案解决了我对代码实施 OO 的需求。考虑到 OOP,这就是我一直在寻找的东西。但我决定在我的程序中采用程序风格,@soyuka 的回答效果很好。顺便谢谢你。 :D
【解决方案3】:

数组在 JSON 中只能是数字,因此关联数组的编码方式与对象相同。您只需像往常一样拨打json_encode

json_encode($array)

在 PHP 中解码 JSON 时,如果您想要一个关联数组而不是对象,请将 true 作为第二个参数传入:

json_decode($json,true);

如果您想要一个对象,您可以传入false 作为第二个参数,或者不使用它,因为falsejson_decodeassociative 参数的默认值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 2015-04-28
    • 2020-07-18
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    相关资源
    最近更新 更多