【问题标题】:Get specific data from a JSON object (Steam Api)从 JSON 对象(Steam Api)获取特定数据
【发布时间】:2016-04-06 21:19:27
【问题描述】:

所以我在练习一些 nodejs,这次我在玩 Steam api 和 json 对象。但是我遇到了一些问题。

所以,从 Steam api,

http://steamcommunity.com/profiles/<steamid>/inventory/json/730/2

我从这段代码中得到了 json,

var request = require('request');

var url = "http://steamcommunity.com/profiles/<steamid>/inventory/json/730/2"

request({
    url: url,
    json: true
}, function (error, response, body) {
     if (!error && response.statusCode === 200) {
        var json = JSON.parse(body);
        console.log(body) 
     }
});

json 看起来很精简,json-link

我想从json中取出每个项目的classid和instanceid,但是问题来了。我不知道怎么做。我知道我需要解析它,但不幸的是仅此而已。

如果有人可以解释如何,或链接指南/教程以便我学习,那将非常有帮助。

谢谢!

编辑:

    var request = require('request');
var _ = require('lodash');

var url = "http://steamcommunity.com/profiles/76561198007691048/inventory/json/730/2";


request({
    url: url,
    json: true
}, function jsonParse(error, response, data) {
    console.log(data.rgDescriptions);
    var item = getItems(data.rgDescriptions);
    console.log(item);

}

);

function getItems(data){
    var item = data;
    if(!item){
        return "error";

    }
    return _(item).keys().map(function(id){
        return _.pick([id], "name");}).value();

控制台给我这个; [ {}, {}, {}, {}, {}, {}, {}, {}, {},.... ]

JSON 看起来像这样;

'1293508920_0': 
   { appid: '730',
     classid: '1293508920',
     instanceid: '0',
     icon_url: '-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KU0Zwwo4NUX4oFJZEHLbXU5A1PIYQNqhpOSV-fRPasw8rsUFJ5KBFZv668FF4u1qubIW4Su4mzxYHbzqGtZ-KGlz8EuJcg3rnE9NiijVe3_UY-Zzr2JJjVLFEEeiQRtg',
     icon_drag_url: '',
     name: 'Shadow Case',
     market_hash_name: 'Shadow Case',
     market_name: 'Shadow Case',
     name_color: 'D2D2D2',
     background_color: '',
     type: 'Base Grade Container',
     tradable: 1,
     marketable: 1,
     commodity: 1,
     market_tradable_restriction: '7',
      },
  '1644880589_236997301': 
   { appid: '730',
     classid: '1644880589',
     instanceid: '236997301',
     icon_url: '-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KU0Zwwo4NUX4oFJZEHLbXU5A1PIYQNqhpOSV-fRPasw8rsUFJ4MAlVo6n3e1Y27OPafjBN09izq42ChfbzNvXTlGkD6p0lj7_FpNjx0VDj_UBoZ272cNfBdg48MAyB-VS3xum61Me_ot2XnqkB5QYc',
     icon_drag_url: '',
     name: 'MLG Columbus 2016 Mirage Souvenir Package',
     market_hash_name: 'MLG Columbus 2016 Mirage Souvenir Package',
     market_name: 'MLG Columbus 2016 Mirage Souvenir Package',
     name_color: 'D2D2D2',
     background_color: '',
     type: 'Base Grade Container',
     tradable: 1,
     marketable: 1,
     commodity: 0,
     market_tradable_restriction: '7',
      },

【问题讨论】:

标签: json node.js steam-web-api


【解决方案1】:

要处理复杂的对象或集合,您可以使用 lodash 库。

所以,你有以下格式的 json:

{
  "success":true,
  "rgInventory": {
    "5719625206": {"id":"5719625206","classid":"1651313004","instanceid":"188530139","amount":"1","pos":1},
    "5719034454": {"id":"5719034454","classid":"1649582636","instanceid":"188530139","amount":"1","pos":2},
    "5718628709": {"id":"5718628709","classid":"1649582636","instanceid":"188530139","amount":"1","pos":3},
    ...
  }
}

要提取所需项目的数组,首先在您的项目中安装 lodash 库:npm i -S,然后将此代码添加到您的文件中:

var _ = require('lodash');

function extractItems(data) {
  var rgInventory = _.get(data, 'rgInventory');
  if (!rgInventory) {
    return [];
  }
  return _(rgInventory)
    .keys()
    .map(function(id) {
      return _.pick(rgInventory[id], ['classid', 'instanceid']);
    })
    .value();
}

【讨论】:

  • 感谢您的帮助,但不幸的是,我仍然无法 100% 理解,我理解您共享的代码,但我不明白如何处理它,如何将其应用于对象和然后使用它。我应该把代码放在哪里以及如何将数据放到我的对象中?
  • 嗯,您所需要的只是从您的代码中调用我的函数extractItems。将该调用放在解析 json 的行下方:var items = extractItems(json);
  • 我想我的知识太少,无法做到这一点。我会继续做别的事情。无论如何感谢您的帮助!
  • 嘿!我已经阅读了一些,并决定再次测试。这是我的代码,gyazo.com/db298c2d699ca3a740a8390f0a3e94c7,但我从你的函数中得到错误。我做错了什么?
  • 代码中的Bug,需要将响应体转换为对象:data = JSON.parse(data);
猜你喜欢
  • 1970-01-01
  • 2023-02-23
  • 2016-11-20
  • 1970-01-01
  • 2017-07-03
  • 2020-10-02
  • 1970-01-01
  • 2018-12-21
  • 2017-11-22
相关资源
最近更新 更多