On 9/24/21 12:58 AM, james.p.leblanc wrote:
On Thursday, 23 September 2021 at 20:32:36 UTC, james.p.leblanc wrote:
On Thursday, 23 September 2021 at 19:18:11 UTC, james.p.leblanc wrote:
On Thursday, 23 September 2021 at 19:04:47 UTC, Steven Schveighoffer wrote:
On 9/23/21 2:20 PM, james.p.leblanc wrote:

```
Produces:

typeid(jj): std.json.JSONValue, jj: {"ba":[true,false,true],"d":[1.23399999999999999]} typeid(z5): question.main.MapResult!(__lambda2, JSONValue[]).MapResult, z5: [true, false, true]
z5: [true, false, true]


Sigh ... my suggested "minor edit" above produces a "map result" instead of
the desired native array ... here is the **fix** by appending ".array" at the
end (which is the suffix Steve originally offered).  The following gives
the desired **bool[]** result.

```d
import std.array;

    auto z5 = jj["ba"].array.map!(v => v.get!bool).array;
    writeln("typeid(z5): ", typeid(z5), ", z5: ", z5);
    writeln("z5: ", z5);
```

At first I thought that was allocating 2 arrays, but I didn't realize `JSONValue.array` was an actual member! When I saw your original code, I assumed the `.array` call was a call to `std.array.array`, and that `JSONValue` was somehow usable as a range.

So yes, that's what I should have written.

I admit I have not used `JSONValue`. That `array` accessor is quite a poor name due to the vast prevalence of using `std.array.array` to make an array out of some range. When using vibe.d's JSON type, I usually do `jsval[]` to access the array portion.

Note, you may want to consider whether you actually need a concrete array, as using the map result is pretty much equivalent, yet doesn't allocate anything.

-STeve

Reply via email to