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 6 hours ago
Andy Lester
425416
425416
asked 15 hours ago
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
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
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
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
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
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
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 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
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
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
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