Получить определенные данные из объекта JSON (Steam Api)

Итак, я практикую некоторые nodejs, и на этот раз я играю с объектами Steam API и JSON. Но у меня есть некоторые проблемы.

Итак, из API Steam,

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',
      },

person DavidS    schedule 06.04.2016    source источник
comment
JSON.parse(body) возвращает объект JavaScript (developer.mozilla.org /en-US/docs/Web/JavaScript/Reference/). Чтобы получить доступ к любому из свойств, взгляните на это и посмотрите, поможет ли это: developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/   -  person puelo    schedule 07.04.2016


Ответы (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();
}
person alexmac    schedule 06.04.2016
comment
Спасибо за помощь, но, к сожалению, я до сих пор не понимаю на 100%, я понимаю код, которым вы поделились, но я не понимаю, что с ним делать, как применить его к объекту, а затем использовать его. Где я должен разместить код и как получить данные для моего объекта? - person DavidS; 07.04.2016
comment
Хм, все, что вам нужно, это просто вызвать мою функцию extractItems из вашего кода. Поместите этот вызов под строкой, где вы анализируете json: var items = extractItems(json); - person alexmac; 07.04.2016
comment
Думаю, у меня слишком мало знаний для этого. Я буду продолжать заниматься чем-то другим. Все равно, спасибо за помощь ! - person DavidS; 07.04.2016
comment
Привет! Я немного почитал и решил проверить это снова. Вот мой код, gyazo.com/db298c2d699ca3a740a8390f0a3e94c7, но я получаю сообщение об ошибке из вашей функции. Что я сделал не так? - person DavidS; 12.04.2016
comment
Ошибка в вашем коде, вам нужно преобразовать тело ответа в объект: data = JSON.parse(data); - person alexmac; 12.04.2016
comment
Каждый раз, когда я анализирую, я получаю ошибку, неопределенный 1, неожиданный токен o, вот мой код сейчас, а> - person DavidS; 12.04.2016
comment
Вы уверены, что получаете правильный json с сервера в request вызове? Если json недействителен, он не может быть преобразован в объект и JSON.parse выдает ошибку. - person alexmac; 12.04.2016
comment
Не могли бы вы попробовать этот URL и посмотреть, работает ли он для вас? steamcommunity.com/profiles/76561198007691048/inventory/json/ - person DavidS; 12.04.2016
comment
Когда я пытаюсь проанализировать этот json, я получаю: SyntaxError: JSON.parse: bad control character in string literal at line 1 column 32575 of the JSON data. - person alexmac; 12.04.2016
comment
Обновлено в основных сообщениях ниже редактирования, должна ли консоль выглядеть так или я делаю что-то не так? - person DavidS; 12.04.2016