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 6 hours ago









      Andy Lester

      425416




      425416










      asked 15 hours ago









      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
            14 hours ago











          • 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
            12 hours ago






          • 1





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

            – Kusalananda
            12 hours ago











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

            – sam
            7 hours ago











          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
            14 hours ago











          • 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
            12 hours ago






          • 1





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

            – Kusalananda
            12 hours ago











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

            – sam
            7 hours ago
















          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
            14 hours ago











          • 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
            12 hours ago






          • 1





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

            – Kusalananda
            12 hours ago











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

            – sam
            7 hours ago














          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 14 hours ago

























          answered 14 hours ago









          KusalanandaKusalananda

          136k17256424




          136k17256424








          • 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
            14 hours ago











          • 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
            12 hours ago






          • 1





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

            – Kusalananda
            12 hours ago











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

            – sam
            7 hours ago














          • 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
            14 hours ago











          • 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
            12 hours ago






          • 1





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

            – Kusalananda
            12 hours ago











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

            – sam
            7 hours ago








          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
          14 hours ago





          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
          14 hours ago













          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
          12 hours ago





          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
          12 hours ago




          1




          1





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

          – Kusalananda
          12 hours ago





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

          – Kusalananda
          12 hours ago













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

          – sam
          7 hours ago





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

          – sam
          7 hours ago


















          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

          How did Captain America manage to do this?

          迪纳利

          南乌拉尔铁路局