代码之家  ›  专栏  ›  技术社区  ›  Thomas

从Azure表存储读取奇怪的JSON结构

  •  2
  • Thomas  · 技术社区  · 7 年前

    我正在使用 azure-storage Azure函数内的模块。

    得到这样的行

    var tableSvc = azure.createTableService();
    var query = new azure.TableQuery().top(1000);
    tableSvc.queryEntities('tablename', query, null, function(error, result, response) {
        // work with result.entries
    }
    

    结果对象看起来很奇怪,因为每个列值都用一个“_”键放入自己的对象中,所以JSON看起来像这样:

    {
        "PartitionKey": {
            "$": "Edm.String",
            "_": "Keyname"
        },
        "RowKey": {
            "$": "Edm.String",
            "_": "Keyname"
        },
        "Title": {
            "_": "The Item Title"
        }
    }
    

    而不是我所期望的:

    {
        "PartitionKey": "Keyname",
        "RowKey": "Keyname",
        "Title": "The Item Title"
    }
    

    该表在Azure Storage Explorer中看起来很正常。这正常吗?或者我可以以某种方式影响查询的输出吗?

    2 回复  |  直到 7 年前
        1
  •  7
  •   Aaron Chen    7 年前

    您可以将有效负载格式指定为 application/json;odata=nometadata 然后通过 response.body.value .

    var options = { payloadFormat: "application/json;odata=nometadata" };
    tableSvc.queryEntities('tablename', query, null, options, function(error, result, response) {
        if(!error) {
            console.log(response.body.value);
        }
    }
    
        2
  •  1
  •   Chris Anderson    7 年前

    这是故意的。在他们的文档中可以看到这个例子: https://docs.microsoft.com/en-us/azure/cosmos-db/table-storage-how-to-use-nodejs#add-an-entity-to-a-table

    这可能是因为他们有一个试图维护的类型系统,即使是在JS中。

    也许可以写一个方法来把它抽象出来?

    function getFromTable(cb) {
       var tableSvc = azure.createTableService();
       var query = new azure.TableQuery().top(1000);
       tableSvc.queryEntities('tablename', query, null, function(error, result, response) {
           var response = {};
           for(var item in result) {
               if(result.hasOwnProperty(item)) {
                   response[item] = result[item]["_"];
               }
            }
            cb(response);
       }
    }
    

    我可能也会转而使用承诺而不是回电,但这是我个人的选择。