【问题标题】:Fetch specific data from YQL JSON using JavaScript使用 JavaScript 从 YQL JSON 中获取特定数据
【发布时间】:2015-09-03 06:50:43
【问题描述】:

我目前正在使用 Ionic Cordova 和 AngularJS 进行一个小项目。在这个项目中,我想使用 YQL 从网站获取当前信息。我的 $http.jsonp 请求如下所示:

*"https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D'http%3A%2F%2Fwww.imensa.de%2Fhildesheim%2Fmensa-uni%2Findex.html'%20and%20xpath%3D'%2F%2Fdiv%5B%40class%3D%22primary%20meal%22%5D'&format=json&callback=JSON_CALLBACK"*

翻译成这个 YQL 控制台查询:

*select * from html where url='http://www.imensa.de/hildesheim/mensa-uni/index.html' and xpath='//div[@class="primary meal"]'*

我现在收到的 JSON 数据结构让我有点困惑,因为它看起来不像是直接的 JSON。

{
 "query": {
  "count": 8,
  "created": "2015-09-03T06:27:03Z",
  "lang": "en-US",
  "results": {
   "div": [
    {
     "class": "primary meal",
     "id": "m2267999",
     "div": {
      "class": "description",
      "p": "Gebackener Seelachs mit Remoulade"
     },
     "p": {
      "class": "price",
      "span": {
       "title": "Preis für Studierende",
       "content": "2,10 €"
      }
     },
     "ul": {
      "class": "attributes",
      "li": [
       "Fisch",
       {
        "class": "group",
        "content": "Zusatz"
       },
       "Farbstoff",
       "Süßungsmittel",
       {
        "class": "group",
        "content": "Allergen"
       },
       "Ei",
       "Gluten",
       "Senf",
       {
        "class": "group",
        "content": "Zuletzt"
       },
       "23.07.2015"
      ]
     }
    },
    {
     "class": "primary meal",
     "id": "m3472645",
     "div": {
      "class": "description",
      "p": "Kartoffel-Erbseneintopf in Sojarahm mit Koriander und Minze"
     },
     "p": {
      "class": "price",
      "span": {
       "title": "Preis für Studierende",
       "content": "2,00 €"
      }
     },
     "ul": {
      "class": "attributes",
      "li": [
       "Vegan",
       {
        "class": "group",
        "content": "Zusatz"
       },
       "Antioxidationsmittel",
       {
        "class": "group",
        "content": "Allergen"
       },
       "Gluten",
       "Soja",
       {
        "class": "group",
        "content": "Zuletzt"
       },
       "23.07.2015"
      ]
     }
    },
    {
     "class": "primary meal",
     "id": "m1258254",
     "div": {
      "class": "description",
      "p": "Hähnchen Piccata mit Tomatensauce"
     },
     "p": {
      "class": "price",
      "span": {
       "title": "Preis für Studierende",
       "content": "2,10 €"
      }
     },
     "ul": {
      "class": "attributes",
      "li": [
       "Geflügel",
       {
        "class": "group",
        "content": "Zusatz"
       },
       "Farbstoff",
       "Geschwefelt",
       {
        "class": "group",
        "content": "Allergen"
       },
       "Ei",
       "Gluten",
       "Milch",
       {
        "class": "group",
        "content": "Zuletzt"
       },
       "23.07.2015"
      ]
     }
    },
    {
     "class": "primary meal",
     "id": "m6583065",
     "div": {
      "class": "description",
      "p": "Kräuterkartoffeln"
     },
     "p": {
      "class": "price",
      "span": {
       "title": "Preis für Studierende",
       "content": "0,40 €"
      }
     },
     "ul": {
      "class": "attributes",
      "li": [
       "Vegan",
       {
        "class": "group",
        "content": "Zuletzt"
       },
       "25.08.2015"
      ]
     }
    },
    {
     "class": "primary meal",
     "id": "m3478290",
     "div": {
      "class": "description",
      "p": "Penne Rigate"
     },
     "p": {
      "class": "price",
      "span": {
       "title": "Preis für Studierende",
       "content": "0,40 €"
      }
     },
     "ul": {
      "class": "attributes",
      "li": [
       "Vegan",
       {
        "class": "group",
        "content": "Allergen"
       },
       "Gluten",
       {
        "class": "group",
        "content": "Zuletzt"
       },
       "23.07.2015"
      ]
     }
    },
    {
     "class": "primary meal",
     "id": "m4797363",
     "div": {
      "class": "description",
      "p": "Pfannengemüse"
     },
     "p": {
      "class": "price",
      "span": {
       "title": "Preis für Studierende",
       "content": "0,50 €"
      }
     },
     "ul": {
      "class": "attributes",
      "li": [
       "Vegan",
       {
        "class": "group",
        "content": "Zuletzt"
       },
       "23.07.2015"
      ]
     }
    },
    {
     "class": "primary meal",
     "id": "m2931855",
     "div": {
      "class": "description",
      "p": "Creme-Dessert Erdbeer"
     },
     "p": {
      "class": "price",
      "span": {
       "title": "Preis für Studierende",
       "content": "0,50 €"
      }
     },
     "ul": {
      "class": "attributes",
      "li": [
       {
        "class": "group",
        "content": "Allergen"
       },
       "Milch",
       {
        "class": "group",
        "content": "Zuletzt"
       },
       "23.07.2015"
      ]
     }
    },
    {
     "class": "primary meal",
     "id": "m943602",
     "div": {
      "class": "description",
      "p": "Kirschquark"
     },
     "p": {
      "class": "price",
      "span": {
       "title": "Preis für Studierende",
       "content": "0,50 €"
      }
     },
     "ul": {
      "class": "attributes",
      "li": [
       "Vegetarisch",
       {
        "class": "group",
        "content": "Allergen"
       },
       "Milch",
       {
        "class": "group",
        "content": "Zuletzt"
       },
       "gestern"
      ]
     }
    }
   ]
  }
 }
}

我已经发现我可以使用如下语句遍历这个对象:

{{ data.query.results.div.div.p }}

例如,获取始终包含膳食标题的“主餐”p-tag。但是,不总是相同的信息呢?例如,当我想获取一顿饭的所有过敏原时,我必须在之后获取所有数据

"content": "Allergen"

直到下一个

"class": "group",

我完全不知道该怎么做。 如果您有任何建议,请告诉我。

【问题讨论】:

    标签: javascript json angularjs cordova yql


    【解决方案1】:

    您可以简单地遍历数据,检查过敏原标签,然后添加到数组中。我在这里做了一个 JSFiddle:http://jsfiddle.net/jeg9dna8/。您可以将此策略扩展到您的其余数据。

    var list = data.query.results.div[0].ul.li;
    var isAllergen = false;
    var allergens = [];
    
    for(var i = 0; i < list.length; i++) {
        var item = list[i];
        if(item.class && item.class == 'group')
        {
            if(item.content && item.content == 'Allergen')
            {
                isAllergen = true;
            }
            else
            {
                isAllergen = false;
            }
        }
        else
        {
            if(isAllergen)
            {
                allergens.push(item);
            }
        }
    }
    
    var result = '';
    for(var i = 0; i < allergens.length; i++) {
        result += allergens[i];
        if(i < allergens.length - 1) result += ', ';
    }
    
    document.getElementById('allergens').innerHTML = result;
    

    【讨论】:

    • 非常感谢 :D 帮助...我已经准备好创建主详细信息视图,现在感谢您的回答,我可以展示特定的过敏原。我知道 stackoverflow 告诉我不要在 cmets 中写感谢,但仍然 :D 谢谢
    【解决方案2】:

    如果将返回的 JSON 数据粘贴到 a JSON linter 中,您可以看到它是有效的 JSON。没什么奇怪的。

    请记住,data.query.results.div 是一个数组,因此您应该使用 Angular 专用语句来循环(如果您在 Angular 视图中)或经典的 for 如果您在 JavaScript 文件中。

    【讨论】:

    • 也谢谢你 :D 我真的怀疑 JSON 数据的结构是否正确。不知道,但这对我来说似乎不对,但我还是 JavaScript 新手,我一直认为 JSON 只有一层,基本上就像 { id: '1', name: 'test' } 等...
    猜你喜欢
    • 2013-08-20
    • 2023-03-22
    • 2021-06-22
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    相关资源
    最近更新 更多