Communities

Writing
Writing
Codidact Meta
Codidact Meta
The Great Outdoors
The Great Outdoors
Photography & Video
Photography & Video
Scientific Speculation
Scientific Speculation
Cooking
Cooking
Electrical Engineering
Electrical Engineering
Judaism
Judaism
Languages & Linguistics
Languages & Linguistics
Software Development
Software Development
Mathematics
Mathematics
Christianity
Christianity
Code Golf
Code Golf
Music
Music
Physics
Physics
Linux Systems
Linux Systems
Power Users
Power Users
Tabletop RPGs
Tabletop RPGs
Community Proposals
Community Proposals
tag:snake search within a tag
answers:0 unanswered questions
user:xxxx search by author id
score:0.5 posts with 0.5+ score
"snake oil" exact phrase
votes:4 posts with 4+ votes
created:<1w created < 1 week ago
post_type:xxxx type of post
Search help
Notifications
Mark all as read See all your notifications »
Q&A

Welcome to Software Development on Codidact!

Will you help us build our independent community of developers helping developers? We're small and trying to grow. We welcome questions about all aspects of software development, from design to code to QA and more. Got questions? Got answers? Got code you'd like someone to review? Please join us.

Post History

75%
+4 −0
Q&A Replace leaf arrays with joined strings in a nested structure in jq

Consider the following arbitrarily-nested JSON as input to a jq filter: echo '[{"foo": [1, 2]}, {"bar": [{"baz": ["foo", "baz"]}]}]' | jq '.' My goal is to join leaf arrays into strings: [{"fo...

1 answer  ·  posted 1y ago by ggorlen‭  ·  edited 1y ago by ggorlen‭

Question json jq
#6: History hidden by user avatar ggorlen‭ · 2023-09-10T15:32:14Z (over 1 year ago)
Detailed history before this event is hidden because of a redaction.
Replace leaf arrays with joined strings in a nested structure in jq
Consider the following arbitrarily-nested JSON as input to a jq filter:

```bash
echo '[{"foo": [1, 2]}, {"bar": [{"baz": ["foo", "baz"]}]}]' | jq '.'
```

My goal is to join leaf arrays into strings:

```json
[{"foo": "12"}, {"bar": [{"baz": "foobaz"}]}]
```

The following filter produces the above output:

```jq
walk(if type == "array" and
       all(type != "array" and type != "object")
       then join("") else . end)
```

But if I use this filter on an array-only structure like

```json
[[1, 2], [[3, 4], [[5, 6], [7]]]]
```

I get:

```json
"1234567"
```

Instead of the expected

```json
["12", ["34", ["56", "7"]]]
```

Instead of replacing the leaf arrays with strings, it's reduced the nested structure down to a single string!

If I change my filter to

```jq
walk(if type == "array" and
       all(type != "array" and type != "object")
       then [join("")] else . end)
```

At least the expected structure is preserved, but now the inner strings have an extra single-element array that shouldn't be there:

```json
[["12"], [["34"], [["56"], ["7"]]]]
```

It's not feasible to strip off these single-element arrays after the fact, since a second pass won't differentiate a single-element array that's supposed to be there from a temporary artificial one. I suppose I could add some metadata to enable second-pass differentiation, but this seems messy to code and hacky. I feel like there should be a simple, direct solution.

I also tried changing my `if` branch to `. = join("")` and `. |= join("")`, but these give me the same old `"1234567"`.

How can I reliably join leaf arrays to strings in an arbitrarily-nested structure in-place, without modifying the structure? Why is `walk` flattening arrays but not objects here, anyway?
#5: Post edited by user avatar ggorlen‭ · 2023-09-10T15:32:14Z (over 1 year ago)
Roll back poor edit that uses incorrect markdown bulleting and messes with my original style intent

The detailed changes of this event are hidden because of a redaction.

#4: Post edited by user avatar meta user‭ · 2023-09-09T18:22:17Z (over 1 year ago)
used "bullets formatting", added headings

The detailed changes of this event are hidden because of a redaction.

#3: Post edited by user avatar Alexei‭ · 2023-09-04T06:22:42Z (over 1 year ago)
added relevant tag

The detailed changes of this event are hidden because of a redaction.

#2: Post edited by user avatar ggorlen‭ · 2023-09-03T23:15:31Z (over 1 year ago)
clarify

The detailed changes of this event are hidden because of a redaction.

#1: Initial revision by user avatar ggorlen‭ · 2023-09-03T23:11:22Z (over 1 year ago)

The detailed changes of this event are hidden because of a redaction.