使用javascript解析文档

时间:2012-10-26 09:14:15

标签: javascript xml json parsing

我需要用javascript解析这个json

    {
     "MasterProducts": {
    "MasterProduct": [
      {
        "Productcode": "0903-000192",
        "Description": "ICROCOMPUTER;32FX200 24BIT QFP 132P",
        "ThumbPic": "NoImage.png",
        "RRP": "41.400000",
        "Stock": "0"
      },
      {
        "Productcode": "0160-030",
        "Description": "AXIS MPEG-4 Decoder 50-user licence pack onto 50 separate computers. For all Axis MPEG-4 products that do not support AAC audio encoding. (210 211 210A 211A 213 214 221 225FD 231D+ 232D+ 241S 241Q 241SA 241QA 242SIV 243SA 282 282A).",
        "ThumbPic": "NoImage.png",
        "RRP": "35.230000",
        "Stock": "0"
      },
      {
        "Productcode": "0160-040",
        "Description": "AXIS MPEG-4 +ACC Decoder 50-user license onto 50 separate computers. For all Axis products that supports MPEG-4. (207 207W 207MW 212PTZ 216FD 223M).",
        "ThumbPic": "NoImage.png",
        "RRP": "50.880000",
        "Stock": "0"
      },
      {
        "Productcode": "10403E",
        "Description": "Hotsync palm computer cradle/docking station",
        "ThumbPic": "NoImage.png",
        "RRP": "0.000000",
        "Stock": "2"
      },
      {
        "Productcode": "0903-000193",
        "Description": "ICROCOMPUTER;32FX200 24BIT QFP 132P",
        "ThumbPic": "NoImage.png",
        "RRP": "37.790000",
        "Stock": "0"
      }
    ]
  }
}

我设法做到这一点只有一个结果与此代码

 if(data !== '')
    {
        xmlData = data.childNodes[0].childNodes[0].data;
        objData = app.XML2OBJ(xmlData);            
        var item = objData.MasterProduct.Description;
        //alert(item);
    }

但无法让它与多组结果一起使用。

3 个答案:

答案 0 :(得分:1)

你不需要解析它,JSON是JavaScript对象的制作方式。

// alerting each product description:
for(var product in data.MasterProducts.MasterProduct){
    // "product" is the current iteration in the products array
    alert(product.Description);
    // You can access all the product properties here.
    alert(product.Productcode);
}

应该这样做。现在,假设有机会只返回1个主产品,那么MasterProducts属性不是数组,而是一个对象,上面的for循环可能会中断。防止这种情况的最简单方法是在循环之前将MasterProducts连接成一个空数组。可能会有轻微的性能损失,但我并不认为它至关重要。

// Concat to empty array first
data.MasterProducts.MasterProduct = [].concat(data.MasterProducts.MasterProduct);
// alerting each product description:
for(var product in data.MasterProducts.MasterProduct){
    // "product" is the current iteration in the products array
    alert(product.Description);
    // You can access all the product properties here.
    alert(product.Productcode);
}

我把答案写成循环,因为我想要处理所有产品。 如果您只想访问第一个产品,则可以访问产品阵列:

data.MasterProducts.MasterProduct[0].Description

答案 1 :(得分:0)

正如人们在上述评论中讨论过的那样,您只需使用普通的vanilla JavaScript即可访问数据。

var data = // JSON 

console.log(data.MasterProducts.MasterProduct[0].Productcode);

会给你0903-000192。包含方括号[]的对象是数组。对于他们,您可以使用arr[0]的数组表示法。对于对象,您可以使用它们的键名。

{
"MasterProducts": {
 "MasterProduct": [
   {
     "Productcode": "0903-000192",
     "Description": "ICROCOMPUTER;32FX200 24BIT QFP 132P",
     "ThumbPic": "NoImage.png",
     "RRP": "41.400000",
     "Stock": "0"
   }
 ]
}

MasterProducts是您的根对象,因此您可以将其用作入口点。

var products = data.MasterProducts;

现在,要获取产品列表的第一个元素,可以使用数组表示法。

products.MasterProduct[0]

要获取该元素的其中一个属性,您可以再次使用点符号 -

products.MasterProduct[0].Description //"ICROCOMPUTER;32FX200 24BIT QFP 132P"

答案 2 :(得分:0)

json是javascript原生的 - 不需要解析器。

但我会告诉你如何使用NPEG解析任何类型的文件,包括json。

使用javascript

解析文档

您也可以使用 https://github.com/leblancmeneses/NPEG/tree/master/Languages/npeg_javascript

这是一个可以导出C版本的可视化工具:http://www.robusthaven.com/blog/parsing-expression-grammar/npeg-language-workbench

规则语法的文档:http://www.robusthaven.com/blog/parsing-expression-grammar/npeg-dsl-documentation

规则

    S: [\s]*;
(?<StringValue>):  '"' (?<String> [^"]+) '"' / "'" (?<String> [^']+) "'";
(?<NumberValue>):  [0-9]+ ('.' [0-9]+)?;

(?<KeyValuePair>): ( '"'  (?<Key>[^"]+) '"' / "'" (?<Key> [^']+) "'" ) S ':' S  (StringValue / NumberValue / ValueRecursive) S;
(?<Object>): '{' S ( S  KeyValuePair S  ','? )*  S '}'; 
(?<Array>): '[' S (  S Object S  ','? )* S ']';
ValueRecursive: Array / Object ;
(?<JSON>): S ValueRecursive S;

输入我试过: 这个问题和http://en.wikipedia.org/wiki/JSON上的第一个输入。