Error message “Cannot index array with string 'Title'” when parsing JSON data with jq












6















{
"content": [
{
"Title": "abc",
"brand": "xyz",
"size": "5 g",
"date": "2019-01-01",
"details": {
"Temperature": [
{
"value": "90",
"characteristics":"Normal"
},
{
"value":"100",
"characteristics":"high"
},

{
"value":"80",
"characteristics":"low"
}
],

"certifications": [
{
"value": "based",
"characteristics":"pass"
},

{
"value": "50",
"characteristics":"failed"
}
]
},

"formats": {
"city": "NYC",
"id": "007",
"manufacture":""
},
"innerDetails": [
{
"contains": "abc",
"panel":"xyz",
"values":[
{
"name":"abc",
"value":"10"
},
{
"name":"xyz",
"value":"20"
}
]
}
]
}
]
}


I have tried the below approach, but getting the error




Cannot index array with string "Title"




jq -r '.content|[.Title,.brand,.characteristics,.value]' $jsonfile.


I was trying on the same line with other sections, but getting the same error.



How do I solve this issue?



Expected output:



abc,xyz,90,Normal.
abc,xyz,100,high.
abc,xyz,80,low









share|improve this question





























    6















    {
    "content": [
    {
    "Title": "abc",
    "brand": "xyz",
    "size": "5 g",
    "date": "2019-01-01",
    "details": {
    "Temperature": [
    {
    "value": "90",
    "characteristics":"Normal"
    },
    {
    "value":"100",
    "characteristics":"high"
    },

    {
    "value":"80",
    "characteristics":"low"
    }
    ],

    "certifications": [
    {
    "value": "based",
    "characteristics":"pass"
    },

    {
    "value": "50",
    "characteristics":"failed"
    }
    ]
    },

    "formats": {
    "city": "NYC",
    "id": "007",
    "manufacture":""
    },
    "innerDetails": [
    {
    "contains": "abc",
    "panel":"xyz",
    "values":[
    {
    "name":"abc",
    "value":"10"
    },
    {
    "name":"xyz",
    "value":"20"
    }
    ]
    }
    ]
    }
    ]
    }


    I have tried the below approach, but getting the error




    Cannot index array with string "Title"




    jq -r '.content|[.Title,.brand,.characteristics,.value]' $jsonfile.


    I was trying on the same line with other sections, but getting the same error.



    How do I solve this issue?



    Expected output:



    abc,xyz,90,Normal.
    abc,xyz,100,high.
    abc,xyz,80,low









    share|improve this question



























      6












      6








      6








      {
      "content": [
      {
      "Title": "abc",
      "brand": "xyz",
      "size": "5 g",
      "date": "2019-01-01",
      "details": {
      "Temperature": [
      {
      "value": "90",
      "characteristics":"Normal"
      },
      {
      "value":"100",
      "characteristics":"high"
      },

      {
      "value":"80",
      "characteristics":"low"
      }
      ],

      "certifications": [
      {
      "value": "based",
      "characteristics":"pass"
      },

      {
      "value": "50",
      "characteristics":"failed"
      }
      ]
      },

      "formats": {
      "city": "NYC",
      "id": "007",
      "manufacture":""
      },
      "innerDetails": [
      {
      "contains": "abc",
      "panel":"xyz",
      "values":[
      {
      "name":"abc",
      "value":"10"
      },
      {
      "name":"xyz",
      "value":"20"
      }
      ]
      }
      ]
      }
      ]
      }


      I have tried the below approach, but getting the error




      Cannot index array with string "Title"




      jq -r '.content|[.Title,.brand,.characteristics,.value]' $jsonfile.


      I was trying on the same line with other sections, but getting the same error.



      How do I solve this issue?



      Expected output:



      abc,xyz,90,Normal.
      abc,xyz,100,high.
      abc,xyz,80,low









      share|improve this question
















      {
      "content": [
      {
      "Title": "abc",
      "brand": "xyz",
      "size": "5 g",
      "date": "2019-01-01",
      "details": {
      "Temperature": [
      {
      "value": "90",
      "characteristics":"Normal"
      },
      {
      "value":"100",
      "characteristics":"high"
      },

      {
      "value":"80",
      "characteristics":"low"
      }
      ],

      "certifications": [
      {
      "value": "based",
      "characteristics":"pass"
      },

      {
      "value": "50",
      "characteristics":"failed"
      }
      ]
      },

      "formats": {
      "city": "NYC",
      "id": "007",
      "manufacture":""
      },
      "innerDetails": [
      {
      "contains": "abc",
      "panel":"xyz",
      "values":[
      {
      "name":"abc",
      "value":"10"
      },
      {
      "name":"xyz",
      "value":"20"
      }
      ]
      }
      ]
      }
      ]
      }


      I have tried the below approach, but getting the error




      Cannot index array with string "Title"




      jq -r '.content|[.Title,.brand,.characteristics,.value]' $jsonfile.


      I was trying on the same line with other sections, but getting the same error.



      How do I solve this issue?



      Expected output:



      abc,xyz,90,Normal.
      abc,xyz,100,high.
      abc,xyz,80,low






      jq






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Mar 17 at 18:40









      Andy Lester

      425416




      425416










      asked Mar 17 at 9:59









      samsam

      386




      386






















          1 Answer
          1






          active

          oldest

          votes


















          8














          You are not getting Cannot index array with string "Title" with that command, you are getting



          [
          "abc",
          "xyz",
          null,
          null
          ]


          since there is no characteristics or value key in the objects of the contents array (they are keys in the .details.Temperature sub-array).



          The command that would have given you that message is:



          jq -r '. | [.Title,.brand,.characteristics,.value]' "$jsonfile"


          or



          jq -r '.content | [.Title,.brand,.characteristics,.value]' "$jsonfile"


          Missing out the content key lookup, or failing to get the elements of the content array, yields an array of one object rather than the object itself. And you can't index an array with a string.





          Assuming you want CSV output:



          $ jq -r '.content | .details.Temperature as $t | [.Title,.brand,$t.value,$t.characteristics] | @csv' file.json
          "abc","xyz","90","Normal"
          "abc","xyz","100","high"
          "abc","xyz","80","low"


          The <object(s)> as <variable> acts like a loop in jq, so what happens here is that $t will be assigned each element of .details.Temperature in turn, and for each element, a new array is constructed. The array is passed through @csv which will output CSV-formatted rows.



          jq will always double quote the fields of its CSV output. To get rid of unnecessary quotes:



          jq -r '...as above...' file.json | csvformat


          (csvformat is part of csvkit)



          Or, you may want to use @tsv in place of @csv to get tab-delimited output instead.






          share|improve this answer





















          • 2





            Kusal Thank you for your inputs. I am using above thing with for loop. details below. for field in Temperature certifications ; do echo $field :: jq --arg field "$field" -r ' .content | .details."$field" as $t | [.Title,.brand,$t.value,$t.characteristics] | @csv' file.json done. but getting "jq: error: try .["field"] instead of .field for unusually named fields at <top-level>, line 1:"

            – sam
            Mar 17 at 10:49











          • I got this, I was not able to correlate and was putting .details.$[field] or .details."$field". Now I have changed that to .details[$field] and it's working fine now.

            – sam
            Mar 17 at 12:12






          • 1





            @sam Sorry, I was elsewhere. Yes, .details[$field] or .["details"][$field] is the correct syntax.

            – Kusalananda
            Mar 17 at 12:23











          • I have up-voted and thank you for your support.

            – sam
            Mar 17 at 18:05











          • Kusal,sorry for bothering you again. Is it possible to get the content main values without giving the name of fields."Title","brand","size","date" values. something like jq -r .content | and it give me all the main values as mentioned above.

            – sam
            Mar 19 at 6:11













          Your Answer








          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "106"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: false,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: null,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f506789%2ferror-message-cannot-index-array-with-string-title-when-parsing-json-data-wi%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          8














          You are not getting Cannot index array with string "Title" with that command, you are getting



          [
          "abc",
          "xyz",
          null,
          null
          ]


          since there is no characteristics or value key in the objects of the contents array (they are keys in the .details.Temperature sub-array).



          The command that would have given you that message is:



          jq -r '. | [.Title,.brand,.characteristics,.value]' "$jsonfile"


          or



          jq -r '.content | [.Title,.brand,.characteristics,.value]' "$jsonfile"


          Missing out the content key lookup, or failing to get the elements of the content array, yields an array of one object rather than the object itself. And you can't index an array with a string.





          Assuming you want CSV output:



          $ jq -r '.content | .details.Temperature as $t | [.Title,.brand,$t.value,$t.characteristics] | @csv' file.json
          "abc","xyz","90","Normal"
          "abc","xyz","100","high"
          "abc","xyz","80","low"


          The <object(s)> as <variable> acts like a loop in jq, so what happens here is that $t will be assigned each element of .details.Temperature in turn, and for each element, a new array is constructed. The array is passed through @csv which will output CSV-formatted rows.



          jq will always double quote the fields of its CSV output. To get rid of unnecessary quotes:



          jq -r '...as above...' file.json | csvformat


          (csvformat is part of csvkit)



          Or, you may want to use @tsv in place of @csv to get tab-delimited output instead.






          share|improve this answer





















          • 2





            Kusal Thank you for your inputs. I am using above thing with for loop. details below. for field in Temperature certifications ; do echo $field :: jq --arg field "$field" -r ' .content | .details."$field" as $t | [.Title,.brand,$t.value,$t.characteristics] | @csv' file.json done. but getting "jq: error: try .["field"] instead of .field for unusually named fields at <top-level>, line 1:"

            – sam
            Mar 17 at 10:49











          • I got this, I was not able to correlate and was putting .details.$[field] or .details."$field". Now I have changed that to .details[$field] and it's working fine now.

            – sam
            Mar 17 at 12:12






          • 1





            @sam Sorry, I was elsewhere. Yes, .details[$field] or .["details"][$field] is the correct syntax.

            – Kusalananda
            Mar 17 at 12:23











          • I have up-voted and thank you for your support.

            – sam
            Mar 17 at 18:05











          • Kusal,sorry for bothering you again. Is it possible to get the content main values without giving the name of fields."Title","brand","size","date" values. something like jq -r .content | and it give me all the main values as mentioned above.

            – sam
            Mar 19 at 6:11


















          8














          You are not getting Cannot index array with string "Title" with that command, you are getting



          [
          "abc",
          "xyz",
          null,
          null
          ]


          since there is no characteristics or value key in the objects of the contents array (they are keys in the .details.Temperature sub-array).



          The command that would have given you that message is:



          jq -r '. | [.Title,.brand,.characteristics,.value]' "$jsonfile"


          or



          jq -r '.content | [.Title,.brand,.characteristics,.value]' "$jsonfile"


          Missing out the content key lookup, or failing to get the elements of the content array, yields an array of one object rather than the object itself. And you can't index an array with a string.





          Assuming you want CSV output:



          $ jq -r '.content | .details.Temperature as $t | [.Title,.brand,$t.value,$t.characteristics] | @csv' file.json
          "abc","xyz","90","Normal"
          "abc","xyz","100","high"
          "abc","xyz","80","low"


          The <object(s)> as <variable> acts like a loop in jq, so what happens here is that $t will be assigned each element of .details.Temperature in turn, and for each element, a new array is constructed. The array is passed through @csv which will output CSV-formatted rows.



          jq will always double quote the fields of its CSV output. To get rid of unnecessary quotes:



          jq -r '...as above...' file.json | csvformat


          (csvformat is part of csvkit)



          Or, you may want to use @tsv in place of @csv to get tab-delimited output instead.






          share|improve this answer





















          • 2





            Kusal Thank you for your inputs. I am using above thing with for loop. details below. for field in Temperature certifications ; do echo $field :: jq --arg field "$field" -r ' .content | .details."$field" as $t | [.Title,.brand,$t.value,$t.characteristics] | @csv' file.json done. but getting "jq: error: try .["field"] instead of .field for unusually named fields at <top-level>, line 1:"

            – sam
            Mar 17 at 10:49











          • I got this, I was not able to correlate and was putting .details.$[field] or .details."$field". Now I have changed that to .details[$field] and it's working fine now.

            – sam
            Mar 17 at 12:12






          • 1





            @sam Sorry, I was elsewhere. Yes, .details[$field] or .["details"][$field] is the correct syntax.

            – Kusalananda
            Mar 17 at 12:23











          • I have up-voted and thank you for your support.

            – sam
            Mar 17 at 18:05











          • Kusal,sorry for bothering you again. Is it possible to get the content main values without giving the name of fields."Title","brand","size","date" values. something like jq -r .content | and it give me all the main values as mentioned above.

            – sam
            Mar 19 at 6:11
















          8












          8








          8







          You are not getting Cannot index array with string "Title" with that command, you are getting



          [
          "abc",
          "xyz",
          null,
          null
          ]


          since there is no characteristics or value key in the objects of the contents array (they are keys in the .details.Temperature sub-array).



          The command that would have given you that message is:



          jq -r '. | [.Title,.brand,.characteristics,.value]' "$jsonfile"


          or



          jq -r '.content | [.Title,.brand,.characteristics,.value]' "$jsonfile"


          Missing out the content key lookup, or failing to get the elements of the content array, yields an array of one object rather than the object itself. And you can't index an array with a string.





          Assuming you want CSV output:



          $ jq -r '.content | .details.Temperature as $t | [.Title,.brand,$t.value,$t.characteristics] | @csv' file.json
          "abc","xyz","90","Normal"
          "abc","xyz","100","high"
          "abc","xyz","80","low"


          The <object(s)> as <variable> acts like a loop in jq, so what happens here is that $t will be assigned each element of .details.Temperature in turn, and for each element, a new array is constructed. The array is passed through @csv which will output CSV-formatted rows.



          jq will always double quote the fields of its CSV output. To get rid of unnecessary quotes:



          jq -r '...as above...' file.json | csvformat


          (csvformat is part of csvkit)



          Or, you may want to use @tsv in place of @csv to get tab-delimited output instead.






          share|improve this answer















          You are not getting Cannot index array with string "Title" with that command, you are getting



          [
          "abc",
          "xyz",
          null,
          null
          ]


          since there is no characteristics or value key in the objects of the contents array (they are keys in the .details.Temperature sub-array).



          The command that would have given you that message is:



          jq -r '. | [.Title,.brand,.characteristics,.value]' "$jsonfile"


          or



          jq -r '.content | [.Title,.brand,.characteristics,.value]' "$jsonfile"


          Missing out the content key lookup, or failing to get the elements of the content array, yields an array of one object rather than the object itself. And you can't index an array with a string.





          Assuming you want CSV output:



          $ jq -r '.content | .details.Temperature as $t | [.Title,.brand,$t.value,$t.characteristics] | @csv' file.json
          "abc","xyz","90","Normal"
          "abc","xyz","100","high"
          "abc","xyz","80","low"


          The <object(s)> as <variable> acts like a loop in jq, so what happens here is that $t will be assigned each element of .details.Temperature in turn, and for each element, a new array is constructed. The array is passed through @csv which will output CSV-formatted rows.



          jq will always double quote the fields of its CSV output. To get rid of unnecessary quotes:



          jq -r '...as above...' file.json | csvformat


          (csvformat is part of csvkit)



          Or, you may want to use @tsv in place of @csv to get tab-delimited output instead.







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Mar 17 at 10:34

























          answered Mar 17 at 10:15









          KusalanandaKusalananda

          137k17258426




          137k17258426








          • 2





            Kusal Thank you for your inputs. I am using above thing with for loop. details below. for field in Temperature certifications ; do echo $field :: jq --arg field "$field" -r ' .content | .details."$field" as $t | [.Title,.brand,$t.value,$t.characteristics] | @csv' file.json done. but getting "jq: error: try .["field"] instead of .field for unusually named fields at <top-level>, line 1:"

            – sam
            Mar 17 at 10:49











          • I got this, I was not able to correlate and was putting .details.$[field] or .details."$field". Now I have changed that to .details[$field] and it's working fine now.

            – sam
            Mar 17 at 12:12






          • 1





            @sam Sorry, I was elsewhere. Yes, .details[$field] or .["details"][$field] is the correct syntax.

            – Kusalananda
            Mar 17 at 12:23











          • I have up-voted and thank you for your support.

            – sam
            Mar 17 at 18:05











          • Kusal,sorry for bothering you again. Is it possible to get the content main values without giving the name of fields."Title","brand","size","date" values. something like jq -r .content | and it give me all the main values as mentioned above.

            – sam
            Mar 19 at 6:11
















          • 2





            Kusal Thank you for your inputs. I am using above thing with for loop. details below. for field in Temperature certifications ; do echo $field :: jq --arg field "$field" -r ' .content | .details."$field" as $t | [.Title,.brand,$t.value,$t.characteristics] | @csv' file.json done. but getting "jq: error: try .["field"] instead of .field for unusually named fields at <top-level>, line 1:"

            – sam
            Mar 17 at 10:49











          • I got this, I was not able to correlate and was putting .details.$[field] or .details."$field". Now I have changed that to .details[$field] and it's working fine now.

            – sam
            Mar 17 at 12:12






          • 1





            @sam Sorry, I was elsewhere. Yes, .details[$field] or .["details"][$field] is the correct syntax.

            – Kusalananda
            Mar 17 at 12:23











          • I have up-voted and thank you for your support.

            – sam
            Mar 17 at 18:05











          • Kusal,sorry for bothering you again. Is it possible to get the content main values without giving the name of fields."Title","brand","size","date" values. something like jq -r .content | and it give me all the main values as mentioned above.

            – sam
            Mar 19 at 6:11










          2




          2





          Kusal Thank you for your inputs. I am using above thing with for loop. details below. for field in Temperature certifications ; do echo $field :: jq --arg field "$field" -r ' .content | .details."$field" as $t | [.Title,.brand,$t.value,$t.characteristics] | @csv' file.json done. but getting "jq: error: try .["field"] instead of .field for unusually named fields at <top-level>, line 1:"

          – sam
          Mar 17 at 10:49





          Kusal Thank you for your inputs. I am using above thing with for loop. details below. for field in Temperature certifications ; do echo $field :: jq --arg field "$field" -r ' .content | .details."$field" as $t | [.Title,.brand,$t.value,$t.characteristics] | @csv' file.json done. but getting "jq: error: try .["field"] instead of .field for unusually named fields at <top-level>, line 1:"

          – sam
          Mar 17 at 10:49













          I got this, I was not able to correlate and was putting .details.$[field] or .details."$field". Now I have changed that to .details[$field] and it's working fine now.

          – sam
          Mar 17 at 12:12





          I got this, I was not able to correlate and was putting .details.$[field] or .details."$field". Now I have changed that to .details[$field] and it's working fine now.

          – sam
          Mar 17 at 12:12




          1




          1





          @sam Sorry, I was elsewhere. Yes, .details[$field] or .["details"][$field] is the correct syntax.

          – Kusalananda
          Mar 17 at 12:23





          @sam Sorry, I was elsewhere. Yes, .details[$field] or .["details"][$field] is the correct syntax.

          – Kusalananda
          Mar 17 at 12:23













          I have up-voted and thank you for your support.

          – sam
          Mar 17 at 18:05





          I have up-voted and thank you for your support.

          – sam
          Mar 17 at 18:05













          Kusal,sorry for bothering you again. Is it possible to get the content main values without giving the name of fields."Title","brand","size","date" values. something like jq -r .content | and it give me all the main values as mentioned above.

          – sam
          Mar 19 at 6:11







          Kusal,sorry for bothering you again. Is it possible to get the content main values without giving the name of fields."Title","brand","size","date" values. something like jq -r .content | and it give me all the main values as mentioned above.

          – sam
          Mar 19 at 6:11




















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Unix & Linux Stack Exchange!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f506789%2ferror-message-cannot-index-array-with-string-title-when-parsing-json-data-wi%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Færeyskur hestur Heimild | Tengill | Tilvísanir | LeiðsagnarvalRossið - síða um færeyska hrossið á færeyskuGott ár hjá færeyska hestinum

          He _____ here since 1970 . Answer needed [closed]What does “since he was so high” mean?Meaning of “catch birds for”?How do I ensure “since” takes the meaning I want?“Who cares here” meaningWhat does “right round toward” mean?the time tense (had now been detected)What does the phrase “ring around the roses” mean here?Correct usage of “visited upon”Meaning of “foiled rail sabotage bid”It was the third time I had gone to Rome or It is the third time I had been to Rome

          Bunad