Error message “Cannot index array with string 'Title'” when parsing JSON data with jq
{
"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
add a comment |
{
"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
add a comment |
{
"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
{
"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
jq
edited Mar 17 at 18:40
Andy Lester
425416
425416
asked Mar 17 at 9:59
samsam
386
386
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
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.
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
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
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
add a comment |
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.
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
add a comment |
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.
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.
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
add a comment |
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
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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