Home > Back-end >  How to parse json if Key'name dynamicly changes each time node js
How to parse json if Key'name dynamicly changes each time node js

Time:10-22

I receive JSON data from the service, but the keys change in the data with each request, below I will give an example in three versions.

Exmaple 1:

{
  "trackingPayloads": {
    "Rltyn4gLRIWRKj9kS0YpWXytG81GZwcPWjEE7f31ALlq": "{"title":"Red Shoes","index":3,"id":"17777","type":"category"}',
    "ywtA6OyM0hzVZZvnUjxoxJDI1Er9ArfNr8XKyi1D5Zzk": "{"title":"White Shoes","index":3,"id":"17777","type":"category"}',
  }
}

Example 2:

{
  "trackingPayloads": {
    "36tW7DqZ3H9KKBEAumZmowmUwmDRmVCjQgv5zi9GM3Kz": "{"title":"Red Shoes","index":3,"id":"17777","type":"category"}',
    "OgtE51n3YtvrVXWLFjPmpnRt2k5DExF7ovxmBTZrZ6wV": "{"title":"White Shoes","index":3,"id":"17777","type":"category"}',
  }
}

Example 3:

{
  "trackingPayloads": {
    "k2toY29glt2JEp9Wi1X5M7ocno0E0mS4JQVyDuGyQ2rM": "{"title":"Red Shoes","index":3,"id":"17777","type":"category"}'",
    "5ef2ec3c3573eebecc9690b69619ec7b9c93b609": "{"title":"White Shoes","index":3,"id":"17777","type":"category"}',
  }
}

As you can see, the data included in the keys does not change since I am requesting the same information, but the key will change with each request.

Please help, what are the options to get the data Title, Index and any other content in these keys using node js?

Only one option came to my mind - to rename the keys upon receipt in 1,2,3 ... and then get data from them, but this needs to be done dynamically, since about 120 requests per minute are made, you need to get this data quickly, there are no options to save it to a file (I didn’t understand how)

UPDATE, added my code.

I am attaching an example of my code, the idea is to eventually get the data I need from the right keys from trackingPayloads, please help with the code <3

const AwaitAPIResponse = await ProductAPI(product_sku);
            const $ = cheerio.load(AwaitAPIResponse);
            const JSONDATA = [];
            $('pre').each(function() {
                JSONDATA.push($(this).text());
            });
            const ProductJson = JSON.parse(JSONDATA[0]) // this is where I get all the data
            const MainJson = ProductJson["trackingPayloads"] // here I go to the trackingPayloads you saw above

How can I get the data I need?

CodePudding user response:

You can use Object.keys() to get all the different keys of an object and use a loop to go through them.

Therefore, you can rework this code in such a way that each of the values is stored as an element in an array, maybe makes the data easier to work with:

const convert = object => {
    const ret = []
    for (const key of Object.keys(object)) {
        ret.push(object[key])
    }
    return ret
}

This will give you following result for your use case:

[{"title":"Red Shoes","index":3,"id":"17777","type":"category"},
{"title":"Red Shoes","index":3,"id":"17777","type":"category"}]

The way you'd call this is as follows:

const some_parsed_json = { "k2toY29glt2JEp9Wi1X5M7ocno0E0mS4JQVyDuGyQ2rM": "{"title":"Red Shoes","index":3,"id":"17777","type":"category"}'",
"5ef2ec3c3573eebecc9690b69619ec7b9c93b609": "{"title":"Red Shoes","index":3,"id":"17777","type":"category"}' } 

const json_object_values = convertor(some_parsed_json)

CodePudding user response:

If you don't car about the key you could use Object.values on the received object to get the values

Object.values(payload)
// With your example it will return:
// [{"title":"Red Shoes","index":3,"id":"17777","type":"category"},
//  {"title":"Red Shoes","index":3,"id":"17777","type":"category"}]

or in a more complete example

async function getParsedValues() {
  const responseString = await service.getData(); // '{"trackingPayloads":{"Rltyn4gLRIWRKj9kS0YpWXytG81GZwcPWjEE7f31ALlq":{"title":"Red Shoes","index":3,"id":"17777","type":"category"},"ywtA6OyM0hzVZZvnUjxoxJDI1Er9ArfNr8XKyi1D5Zzk":{"title":"White Shoes","index":3,"id":"17777","type":"category"}}}' 
  const parsedResponse = JSON.parse(responseString); // {  trackingPayloads: {    Rltyn4gLRIWRKj9kS0YpWXytG81GZwcPWjEE7f31ALlq: { title:'RedShoes', index: 3, id: '17777', type: 'category' },    ywtA6OyM0hzVZZvnUjxoxJDI1Er9ArfNr8XKyi1D5Zzk:{title:'WhiteShoes', index: 3, id: '17777', type: 'category' }  }}

  const values = Object.values(parsedResponse); // [{"title":"Red Shoes","index":3,"id":"17777","type":"category"}, {title:'WhiteShoes', index: 3, id: '17777', type: 'category' }]

  return values;
} 

  • Related