Extracting object elements from CSVs into graphable data

I'm trying to build a graph that will update periodically from an open data source (the COVID-19 data from Our World in Data org (blob:https://ourworldindata.org/f7778f11-7e49-4608-8695-c9c420e6e817). I'm a seasoned programmer trying to learn JSON & Node Red -- it's not really making much sense to me,frankly.

The data comes in OK as a series of objects that look like this:
image

The objects acquire more elements as the number of countries report, so I can't rely on the positions of the elements. In other words, Japan is the 3rd element of the list, but that will change when Canada gets added. I've tried various things none of which produced the expected results.

[{"id":"d6750951.024458","type":"debug","z":"32556e66.f0c022","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":990,"y":260,"wires":[]},{"id":"a0a1bbdf.5bb7b8","type":"change","z":"32556e66.f0c022","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"\"China:\" & msg.payload","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":780,"y":260,"wires":[["d6750951.024458"]]},{"id":"4003ded.07f7f2","type":"switch","z":"32556e66.f0c022","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"China","vt":"str"},{"t":"eq","v":"Canada","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":610,"y":300,"wires":[["a0a1bbdf.5bb7b8"],["6286f841.150b38"]]},{"id":"bb1ddbbb.732d78","type":"function","z":"32556e66.f0c022","name":"","func":"\nvar parts = msg.payload;\nmsg.payload = parts;\nreturn msg;\n","outputs":1,"noerr":0,"x":450,"y":300,"wires":[["4003ded.07f7f2"]]},{"id":"6286f841.150b38","type":"change","z":"32556e66.f0c022","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":" msg.payload.concat(\"Canada\")","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":780,"y":320,"wires":[["b07f7f00.16bfd"]]},{"id":"19ef5c8.f4157a4","type":"csv","z":"32556e66.f0c022","name":"","sep":",","hdrin":true,"hdrout":false,"multi":"one","ret":"\\n","temp":"date,World,Afghanistan,Albania,Algeria,Andorra,Antigua and Barbuda,Argentina,Armenia,Australia,Austria,Azerbaijan,Bahrain,Bangladesh,Belarus,Belgium,Bhutan,Bolivia,Bosnia and Herzegovina,Brazil,Brunei,Bulgaria,Burkina Faso,Cambodia,Cameroon,Canada,Cayman Islands,Chile,China,Colombia,Costa Rica,Cote d'Ivoire,Croatia,Cuba,Cyprus,Czech Republic,Democratic Republic of Congo,Denmark,Dominican Republic,Ecuador,Egypt,Estonia,Ethiopia,Faeroe Islands,Finland,France,French Guiana,French Polynesia,Gabon,Georgia,Germany,Ghana,Gibraltar,Greece,Guadeloupe,Guernsey,Guinea,Guyana,Honduras,Hungary,Iceland,India,Indonesia,International,Iran,Iraq,Ireland,Israel,Italy,Jamaica,Japan,Jersey,Jordan,Kenya,Kuwait,Latvia,Lebanon,Liechtenstein,Lithuania,Luxembourg,Macedonia,Malaysia,Maldives,Malta,Martinique,Mexico,Moldova,Monaco,Mongolia,Morocco,Nepal,Netherlands,New Zealand,Nigeria,Norway,Oman,Pakistan,Palestine,Panama,Paraguay,Peru,Philippines,Poland,Portugal,Puerto Rico,Qatar,Reunion,Romania,Russia,Saint Barthlemy,Saint Martin (French part),Saint Vincent and the Grenadines,San Marino,Saudi Arabia,Senegal,Serbia,Singapore,Slovakia,Slovenia,South Africa,South Korea,Spain,Sri Lanka,Sudan,Sweden,Switzerland,Thailand,Togo,Trinidad and Tobago,Tunisia,Turkey,Ukraine,United Arab Emirates,United Kingdom,United States,Vatican,Venezuela,Vietnam","skip":"0","strings":true,"x":310,"y":300,"wires":[["bb1ddbbb.732d78"]]},{"id":"b07f7f00.16bfd","type":"debug","z":"32556e66.f0c022","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","x":990,"y":320,"wires":[]},{"id":"d26871e7.693cd","type":"http request","z":"32556e66.f0c022","name":"Get COVID data","method":"GET","ret":"txt","paytoqs":false,"url":"https://covid.ourworldindata.org/data/total_cases.csv","tls":"","persist":false,"proxy":"","authType":"","x":140,"y":300,"wires":[["19ef5c8.f4157a4"]]},{"id":"300c2f1f.e165e","type":"inject","z":"32556e66.f0c022","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":120,"y":240,"wires":[["d26871e7.693cd"]]}]\

Obviously I don't grasp some fundamental JSON concepts on how to refer to various parts of an object. Maybe someone can steer me to some docs that explain to me like I'm 5...

That isn't JSON, it is a javascript object. JSON is always a string.
To get the China value use msg.payload.China It is basically the same as the members of a C++ class for example. Have a look at the node-red guide Working with Messages which you will probably find helpful. Also worth looking through the other docs and the examples in the cookbook.

1 Like

This topic was automatically closed 60 days after the last reply. New replies are no longer allowed.