JSON数组与对象/数据表

时间:2016-05-02 07:15:52

标签: php json datatables

根据http://www.w3schools.com/json/json_syntax.asp,JSON'数组'是这样的:

"employees":[
    {"firstName":"John", "lastName":"Doe"}, 
    {"firstName":"Anna", "lastName":"Smith"}, 
    {"firstName":"Peter","lastName":"Jones"}
]

根据相同的来源,这是一个JSON'对象':

{"firstName":"John", "lastName":"Doe"}

我为我的应用程序开发了一个API,这是我收到的JSON响应:

{
    "status":"success",
    "message": [
        {
            "entry_id":"1",
            "entry_name":"12345678",
            "entry_body":"this is just the beginning update",
            "entry_date":"2016-05-01 08:25:51",
            "status":"active","created_timestamp":"2016-05-01 21:25:51",
            "updated_timestamp":null
        },

        {
            "entry_id":"2",
            "entry_name":"one one one",
            "entry_body":"this is just the beginning update 1",
            "entry_date":"2016-05-02 01:44:03",
            "status":"active",
            "created_timestamp":"2016-05-02 14:44:03",  
            "updated_timestamp":null
        },
        {
            "entry_id":"3",
           "entry_name":"two two two",
           "entry_body":"this is just the beginning update 2",
           "entry_date":"2016-05-02 01:44:13",
           "status":"active",
           "created_timestamp":"2016-05-02 14:44:13",
           "updated_timestamp":null
        }
    ]
}

在datatables中,我制作了以下脚本,但它没有读取JSON文件:

var table = $('#list_blogs_table').DataTable({
    "ajax": {
         "url": "/BlogApiV1/BlogApi/blogs",
        "dataSrc": "message",
    }
    "columnDefs":
    [
        {

我的网址必须是GET方法(我正确地做到了吗?)

此外,假设我的JSON数据被视为ARRAY。那是对的吗?我通过声明"dataSrc": "message",告诉数据表数据是从'message'开始的。那是对的吗?

3 个答案:

答案 0 :(得分:1)

您的JSON包含多个隐藏的非法控制字符,它似乎是转义和无效标签。即使您的JSON将作为本地定义的文字工作,它也会在通过网络传递并在客户端上进行JSONified时失败。

将来,您可以使用 https://jsonformatter.curiousconcept.com 来确切了解JSON的错误。您也可以使用 https://myjson.com 进行验证,因为它使用的是JSON.parse(),而不是像 http://jsonlint.com 那样的算法测试你的JSON有效。

所以简单地清理JSON就可以了:

var table = $('#example').DataTable({
  ajax: {
    url: "https://api.myjson.com/bins/14lrs", 
    dataSrc: "message",
  },
  columnDefs: [
    { targets: 0, data: 'entry_id' },
    { targets: 1, data: 'entry_name' }
  ]
})  

演示 - >的 http://jsfiddle.net/3wr2j2yx/

尝试从http://myjson.com/14lrs抓取已清理的JSON,并将其用作源代码。

  

我的网址必须是GET方法(我能正确地做到这一点)吗?

是的!

  

此外,假设我的JSON数据被视为ARRAY。那是对的吗?一世   通过声明告诉数据表数据是从“消息”开始的   “dataSrc”:“消息”,。那是对的吗?

是!

答案 1 :(得分:0)

要查看你的json变成了var_dump或var_export。

比如我们假设您的回复存储在变量$response

$object = json_decode($response);
var_export($object);
var_dump($object);

我们得到以下内容:

 stdClass::__set_state(array(
   'status' => 'success',
   'message' => 
  array (
    0 => 
    stdClass::__set_state(array(
       'entry_id' => '1',
       'entry_name' => '12345678',
       'entry_body' => 'this is just the beginning update',
       'entry_date' => '2016-05-01 08:25:51',
       'status' => 'active',
       'created_timestamp' => '2016-05-01 21:25:51',
       'updated_timestamp' => NULL,
    )),
    1 => 
    stdClass::__set_state(array(
       'entry_id' => '2',
       'entry_name' => 'one one one',
       'entry_body' => 'this is just the beginning update 1',
       'entry_date' => '2016-05-02 01:44:03',
       'status' => 'active',
       'created_timestamp' => '2016-05-02 14:44:03',
       'updated_timestamp' => NULL,
    )),
    2 => 
    stdClass::__set_state(array(
       'entry_id' => '3',
       'entry_name' => 'two two two',
       'entry_body' => 'this is just the beginning update 2',
       'entry_date' => '2016-05-02 01:44:13',
       'status' => 'active',
       'created_timestamp' => '2016-05-02 14:44:13',
       'updated_timestamp' => NULL,
    )),
  ),
))


object(stdClass)#511 (2) {
  ["status"]=>
  string(7) "success"
  ["message"]=>
  array(3) {
    [0]=>
    object(stdClass)#512 (7) {
      ["entry_id"]=>
      string(1) "1"
      ["entry_name"]=>
      string(8) "12345678"
      ["entry_body"]=>
      string(33) "this is just the beginning update"
      ["entry_date"]=>
      string(19) "2016-05-01 08:25:51"
      ["status"]=>
      string(6) "active"
      ["created_timestamp"]=>
      string(19) "2016-05-01 21:25:51"
      ["updated_timestamp"]=>
      NULL
    }
    [1]=>
    object(stdClass)#513 (7) {
      ["entry_id"]=>
      string(1) "2"
      ["entry_name"]=>
      string(11) "one one one"
      ["entry_body"]=>
      string(35) "this is just the beginning update 1"
      ["entry_date"]=>
      string(19) "2016-05-02 01:44:03"
      ["status"]=>
      string(6) "active"
      ["created_timestamp"]=>
      string(19) "2016-05-02 14:44:03"
      ["updated_timestamp"]=>
      NULL
    }
    [2]=>
    object(stdClass)#514 (7) {
      ["entry_id"]=>
      string(1) "3"
      ["entry_name"]=>
      string(11) "two two two"
      ["entry_body"]=>
      string(35) "this is just the beginning update 2"
      ["entry_date"]=>
      string(19) "2016-05-02 01:44:13"
      ["status"]=>
      string(6) "active"
      ["created_timestamp"]=>
      string(19) "2016-05-02 14:44:13"
      ["updated_timestamp"]=>
      NULL
    }
  }
}

如您所见,您的结构解析为一个对象,这是一个关联数组,其中包含一个包含一个关联数组对象的数组;

这意味着您无法作为关联数组进行访问。

所以$ object ['message']不会工作,但$ object->消息将起作用: - )

var_dump($var->message[0]) 

解析为

object(stdClass)#512 (7) {
  ["entry_id"]=>
  string(1) "1"
  ["entry_name"]=>
  string(8) "12345678"
  ["entry_body"]=>
  string(33) "this is just the beginning update"
  ["entry_date"]=>
  string(19) "2016-05-01 08:25:51"
  ["status"]=>
  string(6) "active"
  ["created_timestamp"]=>
  string(19) "2016-05-01 21:25:51"
  ["updated_timestamp"]=>
  NULL
}

您可以像这样访问它: - )

$myobj = $var->message[0]

echo $myobj->status == 'active' 

在javascript中它是,

var obj = JSON.parse(message);
myobj = obj.message[0];
echo myobj.status == 'active';

如果您覆盖jquery的ajax调用,您可以看到以下调用已发送到您的服务器(请参阅我的代码段中的代码以了解如何查看此内容)

正如您所看到的,您的参数将作为额外参数发送到服务器。

[对象] 0:对象    cache:false    data:对象    dataSrc:“消息”    dataType:“json”    错误:(b,c)    成功:(b)    类型:“GET”    url:“/ BlogApiV1 / BlogApi / blogs”

你的ajax响应应如下所示:

{
    "status":"success",
    "data": [
        [
            "1",
            "12345678",
            "this is just the beginning update",
            "2016-05-01 08:25:51",
            "active",
            "2016-05-01 21:25:51",
            null
        ],
        [
            "2",
            "one one one",
            "this is just the beginning update 1",
            "2016-05-02 01:44:03",
            "active",
            "2016-05-02 14:44:03",
            null
          ],
         [
            "3",
            "two two two",
            "this is just the beginning update 2",
            "2016-05-02 01:44:13",
            "active",
            "2016-05-02 14:44:13",
            null
        ]
    ]
}

请参考datatables示例页面并查看底部的源标签:-)他们举例说明了他们希望格式化的内容: - )

答案 2 :(得分:0)

已经解决了问题。解决方案是根据@ Michael-Dibbets'修复JSON输出。很棒的故障。我实际上正在使用Phil Sturgeon的REST服务器来帮助创建API。默认似乎是JSON输出,但是,正如Michael-Dibbets指出的那样,JSON无效。 REST服务器允许格式,包括xml,csv等等。我没有依赖默认值,而是在URL中特别声明了格式,如/ BlogApiV1 / BlogApi / blogs / format / json,这解决了所有问题。感谢大家的评论,并且肯定从错误中学到了很多。