【问题标题】:AJAX Get from a JSON TreeAJAX 从 JSON 树中获取
【发布时间】:2013-09-24 15:22:06
【问题描述】:

我刚开始使用 AJAX,尝试使用 JQuery 的 $.getJSON 函数(或任何相关函数,即 $.load()、$.ajax() 等)。我有一个 JSON 文件,其结构如下:

[
    {
        "id": 1,
        "email": "user@domain.com",
        "password": "password"
    },
    {
        "id": 2,
        "email": "one@two.com",
        "password": "password"
    }
]

如何为具有特定电子邮件的用户调用此 JSON 文件(我们称之为 users.json)的 GET?我认为这将是 $.getJSON 中的第二个参数,但这似乎只是返回整个树。

谢谢!

【问题讨论】:

  • 你需要在javascript中解析客户端的变量,或者让它动态生成users.json并且只为特定用户输出正确的json
  • 您在 JSON 请求中一目了然地显示用户密码?你到底为什么要这样做?

标签: javascript jquery ajax json tree


【解决方案1】:

简短的回答 - 您不能直接使用 AJAX 执行此操作。 jQuery 可以提取部分 HTML 和 XML 文档,但不能提取 JSON。

最简单的答案 - 检索整个对象(无论如何,你必须这样做)并使用 jsonpath 来获得你想要的结构

更长的答案-检索整个对象,然后自己遍历以获取所需的对象

最佳答案 - 将电子邮件地址作为生成 json 的任何脚本的参数,并让服务器只返回您想要的数据。

【讨论】:

  • 必须同意“最佳答案”,尽管如果 OP 不控制 JSON,那么它将不是一个选项。
  • 目前使用最简单的答案,因为我试图在 JS 中做尽可能多的事情。并尝试 jsonpath 和 JSONselect
【解决方案2】:

解析 JSON 后,将其传递给回调函数 - 然后您可以根据需要操作该数组。

您可能需要一些自定义代码:

$.getJSON(myURL, function(data) {
    /* data is an array of objects */
    for (var i=0, j=data.length; i<j; i++) {
        if (data[i].email === some_value) {
            /* do something with data[i] */
        };
    };
});

http://api.jquery.com/jQuery.getJSON/

【讨论】:

  • 什么意思,没有内置方式?总有Array.filter
  • @Alnitak 好吧,显然我不是那个意思....(根据 MDN,Array.filter 不适用于 IE8 及更低版本,因此它不是“始终”可用于此案例。)
  • 对于 IE8,总是有垫片(或垃圾箱...)
【解决方案3】:

您可以做两件事中的一件,在客户端循环遍历数组,或者在每次调用时动态生成 users.json(假设后端服务器语言如 php)

使用动态生成的json文件

JS

$.ajax({
   url:"/users.json.php",
   data:{
      useremail:"someusersemail@here.com"
   }
   type:"POST",
   dataType:"json",
   success:function(userdata){
      //users data will be in userdata
      console.log(userdata.email);
   }
})

服务器脚本(假设为 PHP):users.json.php

$email = $_POST['useremail'];

//get user data based on email
...

echo json_encode($userdata);
die;

生成的 json 文件最终应该输出类似

的内容
{"id": 1,"email": "user@domain.com","password": "password"}

循环方式:在客户端循环遍历用户数组

$.ajax({
   url:"/users.json",
   dataType:"json",
   success:function(data){
      for(i=0;i<data.length;i++) {
         var user = data[i];
         if(user.email == "someemail@gmail.com") {
            //do what you need to with user data
         }
      }
   }
})

【讨论】:

    猜你喜欢
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多