【问题标题】:parsing document in with javascript用javascript解析文档
【发布时间】:2012-10-26 09:14:14
【问题描述】:

我需要用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);
    }

但无法让它处理多组结果。

【问题讨论】:

  • ...但是为什么呢? JSON 可以从 JavaScript 访问,它之所以称为 JSON(JavaScript Object Notation)是有原因的 :)
  • @Jeff:Javascript 序列化对象表示法
  • 哦,我的错 - 我总是把它读成 JavaScript Object Notation
  • @Jeff 实际上是 JavaScript 对象表示法。
  • 是的,我可以访问第一组结果中的数据,但是当我不知道将返回多少组结果时,我该如何处理

标签: javascript xml json parsing


【解决方案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);
}

我将答案写成一个循环,因为我假设您想要处理所有产品。 如果您只想访问第一个产品,则可以访问 products 数组:

data.MasterProducts.MasterProduct[0].Description

【讨论】:

  • 你为什么使用product.Description?
  • 你是在问我为什么使用product.Description,还是product.**Description**?
  • 我已经编辑了我的答案,并附上了解释我为什么使用 product.Description 的说明
【解决方案2】:

正如人们在上面的 cmets 中所讨论的,您可以简单地使用普通的原生 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"

【讨论】:

  • 我在下面尝试过这个,但它没有给我数据。 objData = app.XML2OBJ(数据); var item = objData.MasterProducts; alert(item.MasterProduct[0].Description);
  • 您不需要使用XML2OBJ。数据已经是您可以使用的格式。
  • 这太令人沮丧了,我觉得它应该可以工作,但事实并非如此。我的 web 服务返回一个 xml,我的应用程序 IDE 会自动将其转换为 JSON(根据文档)。所以我不明白为什么它仍然不起作用。错误是无法读取未定义的属性“MasterProduct”:未定义
  • @ama - 看看这个jsFiddle example。你可以看到我没有使用除普通 JavaScript 之外的任何东西来循环所有产品或直接访问一个。
【解决方案3】:

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;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    相关资源
    最近更新 更多