# JSON array parse

**URL:** <https://discourse.nodered.org/t/json-array-parse/28131>\
**Category:** General\
**Created:** [10 June 2020 16:31 UTC](https://discourse.nodered.org/t/json-array-parse/28131 "2020-06-10T16:31:05Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![WatskeBart](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/watskebart/32/23712_2.png) [@WatskeBart](https://discourse.nodered.org/u/WatskeBart)\
**Post date:** [10 June 2020 16:31 UTC](https://discourse.nodered.org/t/json-array-parse/28131/1 "2020-06-10T16:31:05Z")

</div>

Hi all,

I'm fairly new to Node-RED and totally unfamiliar with javascript. Who can help me with my code?

I'm trying to parse a WooCommerce webhook and send some information to my phone thru join (joaoapps).

I searched the web for solutions and I think i'm almost there. I found [this example](https://stackoverflow.com/a/1112609) on stackoverflow and hacked up this little code on [https://js.do/code/json\_iteration](https://js.do/code/json_iteration).  
This displays the result what i'm looking for.

When i'm trying to translate this into Node-RED, i'm only getting the last part (Book D) of the array.  
Here's my flow code:

```auto
[
    {
        "id": "cc4c4710.0e42f8",
        "type": "tab",
        "label": "Flow 1",
        "disabled": false,
        "info": ""
    },
    {
        "id": "6b97b4d9.508d9c",
        "type": "inject",
        "z": "cc4c4710.0e42f8",
        "name": "Test JSON inject",
        "topic": "",
        "payload": "{\"status\":\"completed\",\"total\":\"80.50\",\"line_items\":[{\"name\":\"Book A\",\"quantity\":1},{\"name\":\"Book B\",\"quantity\":2},{\"name\":\"Book C\",\"quantity\":3},{\"name\":\"Book D\",\"quantity\":4}]}",
        "payloadType": "json",
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "x": 240,
        "y": 160,
        "wires": [
            [
                "71becfa3.e7d4b"
            ]
        ]
    },
    {
        "id": "71becfa3.e7d4b",
        "type": "switch",
        "z": "cc4c4710.0e42f8",
        "name": "",
        "property": "payload.status",
        "propertyType": "msg",
        "rules": [
            {
                "t": "eq",
                "v": "completed",
                "vt": "str"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 1,
        "x": 250,
        "y": 260,
        "wires": [
            [
                "b082823.37b478"
            ]
        ]
    },
    {
        "id": "b082823.37b478",
        "type": "function",
        "z": "cc4c4710.0e42f8",
        "name": "Message format",
        "func": "var arr = msg.payload.line_items;\n\nfor (var i = 0; i < arr.length; i++){\n var obj = arr[i];\n book = (\"\\n What: \" + obj.name);\n amount = (\"\\n How many: \" + obj.quantity);\n}\n\nmoney = msg.payload.total;\nmsg.title = \"Books sold!\";\nmsg.text = book + amount + \"\\n\\n Total money earned: \" + money\n\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "x": 260,
        "y": 360,
        "wires": [
            [
                "49943e66.fc353"
            ]
        ]
    },
    {
        "id": "49943e66.fc353",
        "type": "debug",
        "z": "cc4c4710.0e42f8",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "x": 270,
        "y": 460,
        "wires": []
    }
]

```

The WooCommerce JSON output is redacted of course, and the switch node is there to only display when a order is completed.

---

<div class="post-metadata">

**Author:** ![WatskeBart](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/watskebart/32/23712_2.png) [@WatskeBart](https://discourse.nodered.org/u/WatskeBart)\
**Post date:** [10 June 2020 17:20 UTC](https://discourse.nodered.org/t/json-array-parse/28131/2 "2020-06-10T17:20:53Z")

</div>

I think my for loop is wrong because of my **book** and **amount** variable being overwritten by each iteration 🤔

But how can I fix this? Just thinking out loud here 🙃

---

<div class="post-metadata">

**Author:** ![zenofmud](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/zenofmud/32/316_2.png) [@zenofmud](https://discourse.nodered.org/u/zenofmud)\
**Post date:** [10 June 2020 17:48 UTC](https://discourse.nodered.org/t/json-array-parse/28131/3 "2020-06-10T17:48:59Z")

</div>

In the loop, create your output

---

<div class="post-metadata">

**Author:** ![WatskeBart](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/watskebart/32/23712_2.png) [@WatskeBart](https://discourse.nodered.org/u/WatskeBart)\
**Post date:** [10 June 2020 17:49 UTC](https://discourse.nodered.org/t/json-array-parse/28131/4 "2020-06-10T17:49:24Z")

</div>

I'm a bit further by putting the values in a new array.

```auto
var arr = msg.payload.line_items;
var newMsg = [];
for (var i = 0; i < arr.length; i++){
    var obj = arr[i];
    newMsg.push("\n What: " + obj.name + "\n How many: " + obj.quantity);
}

money = msg.payload.total;
msg.title = "Books sold!";
msg.text = newMsg;

return msg;

```

This will show all the books in the msg.text but I think **join** doesn't support a object or array. So now I need to turn it into a string to work I guess. 🤔

---

<div class="post-metadata">

**Author:** ![zenofmud](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/zenofmud/32/316_2.png) [@zenofmud](https://discourse.nodered.org/u/zenofmud)\
**Post date:** [10 June 2020 17:53 UTC](https://discourse.nodered.org/t/json-array-parse/28131/5 "2020-06-10T17:53:19Z")

</div>

try this

```auto
var arr = msg.payload.line_items;
var output = ''
for (var i = 0; i < arr.length; i++){
    var obj = arr[i];
    output += ("\n What: " + obj.name);
    output += ("\n How many: " + obj.quantity);
}

money = msg.payload.total;
msg.title = "Books sold!";
output += "\n\n Total money earned: " + money
msg.text = output

return msg;

```

---

<div class="post-metadata">

**Author:** ![WatskeBart](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/watskebart/32/23712_2.png) [@WatskeBart](https://discourse.nodered.org/u/WatskeBart)\
**Post date:** [10 June 2020 17:54 UTC](https://discourse.nodered.org/t/json-array-parse/28131/6 "2020-06-10T17:54:24Z")

</div>

I think I got it fixed 😃

I converted newMsg.toString() and now it shows up on **join**

Working code here:

```auto
var arr = msg.payload.line_items;
var newMsg = [];
for (var i = 0; i < arr.length; i++){
    var obj = arr[i];
    newMsg.push("\n What: " + obj.name + "\n How many: " + obj.quantity);
}

var convMsg = newMsg.toString();
money = msg.payload.total;
msg.title = "Books sold!";
msg.text = convMsg;

return msg;

```

If there's a better or easier way, please do tell. For now i'm excited it works.  
Sorry for thinking out loud here 🤪

---

<div class="post-metadata">

**Author:** ![WatskeBart](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/watskebart/32/23712_2.png) [@WatskeBart](https://discourse.nodered.org/u/WatskeBart)\
**Post date:** [10 June 2020 17:54 UTC](https://discourse.nodered.org/t/json-array-parse/28131/7 "2020-06-10T17:54:57Z")

</div>

Sorry just saw your proposal now. Will test that as well 🙂

---

<div class="post-metadata">

**Author:** ![zenofmud](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/zenofmud/32/316_2.png) [@zenofmud](https://discourse.nodered.org/u/zenofmud)\
**Post date:** [10 June 2020 17:56 UTC](https://discourse.nodered.org/t/json-array-parse/28131/8 "2020-06-10T17:56:13Z")

</div>

There is always multiple ways to solve a problem 😁

---

<div class="post-metadata">

**Author:** ![WatskeBart](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/watskebart/32/23712_2.png) [@WatskeBart](https://discourse.nodered.org/u/WatskeBart)\
**Post date:** [10 June 2020 18:02 UTC](https://discourse.nodered.org/t/json-array-parse/28131/9 "2020-06-10T18:02:21Z")

</div>

I chose your solution because it looks neater and no conversion toString is needed 😉

Thank you for looking at my code and your proposal 👍🏼

P.S. I marked your reply as the solution

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/1X/d073cd938eafa2e558d7c2cd59003b3ef4963033.png) [@system](https://discourse.nodered.org/u/system)\
**Post date:** [24 June 2020 18:02 UTC](https://discourse.nodered.org/t/json-array-parse/28131/10 "2020-06-24T18:02:27Z")

</div>

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