thedevsaddam/gojsonq

Querying complex json

dre2004 opened this issue · 2 comments

Hi,

I'm very new to Go and I stumbled across this module which I think is fantastic! I have a question more than issue which I'm hoping you can help with.

I have some very complicated and nested json (json output of aws describe instances) which I'm trying to query using gojsonq.

I've added an obfuscated version of the output below, essentially what I'm trying to do is query the Reservations.[].Instances[] to grab some details.

For example the payload below has details for two instances, I'm trying to get the InstanceIds as follows (without any luck).

instances := gojsonq.New().File("instances.json")
res := instances.From("Reservations.[].Instances.[]").Only("InstanceId")

What am I doing wrong? or is the complexity the issue?

{ "NextToken": null, "Reservations": [{ "Groups": null, "Instances": [{ "AmiLaunchIndex": 0, "Architecture": "x86_64", "BlockDeviceMappings": [{ "DeviceName": "/dev/sda1", "Ebs": { "AttachTime": "2017-01-10T12:59:09Z", "DeleteOnTermination": true, "Status": "attached", "VolumeId": "vol-085817e5af91e75ef" } }], "CapacityReservationId": null, "CapacityReservationSpecification": { "CapacityReservationPreference": "open", "CapacityReservationTarget": null }, "CpuOptions": { "CoreCount": 1, "ThreadsPerCore": 1 }, "EbsOptimized": false, "ElasticGpuAssociations": null, "ElasticInferenceAcceleratorAssociations": null, "EnaSupport": null, "HibernationOptions": { "Configured": false }, "Hypervisor": "xen", "ImageId": "ami-ae6259cd", "InstanceId": "i-abcdefg1234", "InstanceLifecycle": null, "InstanceType": "t2.small", "KernelId": null, "KeyName": "obfs", "LaunchTime": "2018-04-23T13:18:58Z", "Licenses": null, "Monitoring": { "State": "disabled" }, "NetworkInterfaces": [{ "Association": null, "Attachment": { "AttachTime": "2018-01-10T12:59:09Z", "AttachmentId": "eni-attach-e6303189", "DeleteOnTermination": true, "DeviceIndex": 0, "Status": "attached" }, "Description": "Primary network interface", "Groups": [{ "GroupId": "sg-obfs", "GroupName": "obfs" }], "InterfaceType": "interface", "Ipv6Addresses": null, "MacAddress": "02:1a:4b:29:c9:1f", "NetworkInterfaceId": "eni-abcdefg", "OwnerId": "0000000000", "PrivateDnsName": "ip-172-0-0-1.ap-southeast-1.compute.internal", "PrivateIpAddress": "172.0.0.1", "PrivateIpAddresses": [{ "Association": null, "Primary": true, "PrivateDnsName": "ip-172-0-0-1.ap-southeast-1.compute.internal", "PrivateIpAddress": "172.0.0.1" }], "SourceDestCheck": true, "Status": "in-use", "SubnetId": "subnet-obfs", "VpcId": "vpc-obfs" }], "Placement": { "Affinity": null, "AvailabilityZone": "ap-southeast-1a", "GroupName": "", "HostId": null, "PartitionNumber": null, "SpreadDomain": null, "Tenancy": "default" }, "Platform": null, "PrivateDnsName": "ip-172-0-0-1.ap-southeast-1.compute.internal", "PrivateIpAddress": "172.0.0.1", "ProductCodes": null, "PublicDnsName": "", "PublicIpAddress": null, "RamdiskId": null, "RootDeviceName": "/dev/sda1", "RootDeviceType": "ebs", "SecurityGroups": [{ "GroupId": "sg-obfs", "GroupName": "obfs" }], "SourceDestCheck": true, "SpotInstanceRequestId": null, "SriovNetSupport": null, "State": { "Code": 80, "Name": "stopped" }, "StateReason": { "Code": "Client.UserInitiatedShutdown", "Message": "Client.UserInitiatedShutdown: User initiated shutdown" }, "StateTransitionReason": "User initiated (2018-04-23 13:38:03 GMT)", "SubnetId": "subnet-b8a736dc", "Tags": [{ "Key": "new", "Value": "tag" }, { "Key": "Name", "Value": "obfs" }, { "Key": "environment", "Value": "DEV" }], "VirtualizationType": "hvm", "VpcId": "vpc-obfs" }], "OwnerId": "00000000000", "RequesterId": null, "ReservationId": "r-012456789" }, { "Groups": null, "Instances": [{ "AmiLaunchIndex": 0, "Architecture": "x86_64", "BlockDeviceMappings": [{ "DeviceName": "/dev/xvda", "Ebs": { "AttachTime": "2018-04-15T11:35:14Z", "DeleteOnTermination": true, "Status": "attached", "VolumeId": "vol-30234567890" } }], "CapacityReservationId": null, "CapacityReservationSpecification": { "CapacityReservationPreference": "open", "CapacityReservationTarget": null }, "ClientToken": "", "CpuOptions": { "CoreCount": 1, "ThreadsPerCore": 1 }, "EbsOptimized": false, "EnaSupport": true, "HibernationOptions": { "Configured": false }, "Hypervisor": "xen", "IamInstanceProfile": null, "ImageId": "ami-001122334455aa1bbb", "InstanceId": "i-9876543210", "InstanceLifecycle": null, "InstanceType": "t2.micro", "KernelId": null, "KeyName": "obfs", "LaunchTime": "2019-04-15T11:35:13Z", "Licenses": null, "Monitoring": { "State": "disabled" }, "NetworkInterfaces": [{ "Association": null, "Attachment": { "AttachTime": "2019-04-15T11:35:13Z", "AttachmentId": "eni-attach-01331224f2b57b180", "DeleteOnTermination": true, "DeviceIndex": 0, "Status": "attached" }, "Description": "", "Groups": [{ "GroupId": "sg-obfs", "GroupName": "obfs1" }], "InterfaceType": "interface", "Ipv6Addresses": null, "MacAddress": "02:8a:6f:31:7c:dc", "NetworkInterfaceId": "eni-obfs", "OwnerId": "0000000000", "PrivateDnsName": "ip-172-0-0-1.ap-southeast-1.compute.internal", "PrivateIpAddress": "172.0.0.1", "PrivateIpAddresses": [{ "Association": null, "Primary": true, "PrivateDnsName": "ip-172-0-0-1.ap-southeast-1.compute.internal", "PrivateIpAddress": "172.0.0.1" }], "SourceDestCheck": true, "Status": "in-use", "SubnetId": "subnet-obfs", "VpcId": "vpc-obfs" }], "Placement": { "Affinity": null, "AvailabilityZone": "ap-southeast-1a", "GroupName": "", "HostId": null, "PartitionNumber": null, "SpreadDomain": null, "Tenancy": "default" }, "Platform": null, "PrivateDnsName": "ip-172-0-0-1.ap-southeast-1.compute.internal", "PrivateIpAddress": "172.0.0.1", "ProductCodes": null, "PublicDnsName": "", "PublicIpAddress": null, "RamdiskId": null, "RootDeviceName": "/dev/xvda", "RootDeviceType": "ebs", "SecurityGroups": [{ "GroupId": "sg-obfs", "GroupName": "obfs1" }], "SourceDestCheck": true, "SpotInstanceRequestId": null, "SriovNetSupport": null, "State": { "Code": 80, "Name": "stopped" }, "StateReason": { "Code": "Client.UserInitiatedShutdown", "Message": "Client.UserInitiatedShutdown: User initiated shutdown" }, "StateTransitionReason": "User initiated (2019-04-15 20:29:38 GMT)", "SubnetId": "subnet-obfs", "Tags": [{ "Key": "purpose", "Value": "dev" }, { "Key": "created", "Value": "2019-04-15" }, { "Key": "Name", "Value": "obfs1" }], "VirtualizationType": "hvm", "VpcId": "vpc-obfs" }], "OwnerId": "00000000000", "RequesterId": null, "ReservationId": "r-obfs" }] }

@dre2004 I'm afraid the package doesn't have the feature right now, but we could add it in future.

This would be useful to me as well. Would usage like:

instances := gojsonq.New().File("instances.json")
res := instances.From("Reservations.[].Instances.[].InstanceId")

instead of

instances := gojsonq.New().File("instances.json")
res := instances.From("Reservations.[].Instances.[]").Only("InstanceId")

be agreeable?