gabs
gabs copied to clipboard
Selecting only inner fields
Hi,
Given the JSON below, you'll notice there are 2 outer object 'etag' and 'Items' and a number of inner objects. My goal is to get rid of the outer object so each inner gets broken down on its own. Is this possible using the gabs utility?
Given JSON:
{
"etag": "\"098f6bcd4621d373cade4e832627b4f6\"",
"items": [
{
"actor": {
"email": "[email protected]",
"profileId": "1111111"
},
"etag": "\"c4ca4238a0b923820dcc509a6f75849b\"",
"events": [
{
"name": "edit",
"parameters": [
{
"boolValue": true,
"name": "primary_event"
},
{
"name": "doc_id",
"value": "randomID1"
},
{
"name": "doc_type",
"value": "spreadsheet"
},
{
"name": "doc_title",
"value": "Document1"
},
{
"name": "owner",
"value": "[email protected]"
}
],
"type": "access"
}
],
"id": {
"applicationName": "drive",
"customerId": "aaaaabbbb",
"time": "2022-01-26T19:11:33.213Z",
"uniqueQualifier": "1111111"
},
"ipAddress": "127.0.0.1",
"kind": "admin#reports#activity"
},
{
"actor": {
"email": "[email protected]",
"profileId": "222222"
},
"etag": "\"c81e728d9d4c2f636f067f89cc14862c\"",
"events": [
{
"name": "edit",
"parameters": [
{
"boolValue": true,
"name": "primary_event"
},
{
"name": "doc_id",
"value": "randomID2"
},
{
"name": "doc_type",
"value": "spreadsheet"
},
{
"name": "doc_title",
"value": "Document2"
},
{
"name": "owner",
"value": "[email protected]"
}
],
"type": "access"
}
],
"id": {
"applicationName": "drive",
"customerId": "aaaaabbbb",
"time": "2022-01-26T19:11:33.213Z",
"uniqueQualifier": "1111111"
},
"ipAddress": "127.0.0.1",
"kind": "admin#reports#activity"
}
],
"kind": "admin#reports#activities"
}
Desired outcome:
{
"Event 1": {
"actor": {
"email": "[email protected]",
"profileId": "222222"
},
"etag": "\"c81e728d9d4c2f636f067f89cc14862c\"",
"events": [
{
"name": "edit",
"parameters": [
{
"boolValue": true,
"name": "primary_event"
},
{
"name": "doc_id",
"value": "randomID2"
},
{
"name": "doc_type",
"value": "spreadsheet"
},
{
"name": "doc_title",
"value": "Document2"
},
{
"name": "owner",
"value": "[email protected]"
}
],
"type": "access"
}
],
"id": {
"applicationName": "drive",
"customerId": "aaaaabbbb",
"time": "2022-01-26T19:11:33.213Z",
"uniqueQualifier": "1111111"
},
"ipAddress": "127.0.0.1",
"kind": "admin#reports#activity"
},
"Event 2": {
"actor": {
"email": "[email protected]",
"profileId": "222222"
},
"etag": "\"c81e728d9d4c2f636f067f89cc14862c\"",
"events": [
{
"name": "edit",
"parameters": [
{
"boolValue": true,
"name": "primary_event"
},
{
"name": "doc_id",
"value": "randomID2"
},
{
"name": "doc_type",
"value": "spreadsheet"
},
{
"name": "doc_title",
"value": "Document2"
},
{
"name": "owner",
"value": "[email protected]"
}
],
"type": "access"
}
],
"id": {
"applicationName": "drive",
"customerId": "aaaaabbbb",
"time": "2022-01-26T19:11:33.213Z",
"uniqueQualifier": "1111111"
},
"ipAddress": "127.0.0.1",
"kind": "admin#reports#activity"
}
}
Hey @BlueCanary-DM, thanks for raising this issue. Please try the following code and let me know if it needs any adjustments:
package main
import (
"encoding/json"
"fmt"
"log"
"github.com/Jeffail/gabs/v2"
)
const (
jsonData = `{
"etag": "\"098f6bcd4621d373cade4e832627b4f6\"",
"items": [
{
"actor": {
"email": "[email protected]",
"profileId": "1111111"
},
"etag": "\"c4ca4238a0b923820dcc509a6f75849b\"",
"events": [
{
"name": "edit",
"parameters": [
{
"boolValue": true,
"name": "primary_event"
},
{
"name": "doc_id",
"value": "randomID1"
},
{
"name": "doc_type",
"value": "spreadsheet"
},
{
"name": "doc_title",
"value": "Document1"
},
{
"name": "owner",
"value": "[email protected]"
}
],
"type": "access"
}
],
"id": {
"applicationName": "drive",
"customerId": "aaaaabbbb",
"time": "2022-01-26T19:11:33.213Z",
"uniqueQualifier": "1111111"
},
"ipAddress": "127.0.0.1",
"kind": "admin#reports#activity"
},
{
"actor": {
"email": "[email protected]",
"profileId": "222222"
},
"etag": "\"c81e728d9d4c2f636f067f89cc14862c\"",
"events": [
{
"name": "edit",
"parameters": [
{
"boolValue": true,
"name": "primary_event"
},
{
"name": "doc_id",
"value": "randomID2"
},
{
"name": "doc_type",
"value": "spreadsheet"
},
{
"name": "doc_title",
"value": "Document2"
},
{
"name": "owner",
"value": "[email protected]"
}
],
"type": "access"
}
],
"id": {
"applicationName": "drive",
"customerId": "aaaaabbbb",
"time": "2022-01-26T19:11:33.213Z",
"uniqueQualifier": "1111111"
},
"ipAddress": "127.0.0.1",
"kind": "admin#reports#activity"
}
],
"kind": "admin#reports#activities"
}`
)
func main() {
jsonObj, err := gabs.ParseJSON([]byte(jsonData))
if err != nil {
log.Fatalf("Failed to parse input JSON: %s", err)
}
outputObj := map[string]interface{}{}
for idx, item := range jsonObj.Path("items").Children() {
outputObj[fmt.Sprintf("Event %d", idx+1)] = item
}
out, err := json.MarshalIndent(outputObj, "", " ")
if err != nil {
log.Fatalf("Failed to marshal output: %s", err)
}
fmt.Println(string(out))
}