skip to Main Content

I have a massive JSON output like this

{
    "result": [
        {
            "name": "Fields",
            "listFields": [
                [
                    "apple"
                ],
                [
                    "Banana__c"
                ]
            ],                    
            "fields": [
                {
                    "name": "apple",
                    "displayName": "Apple",
                    "color": "red",
                    "price": 20
                },
                {
                    "name": "Banana__c",
                    "displayName": "Banana",
                    "color": "yellow",
                    "price": 18
                }
            ]
        }
    ],
    "success": true
}

The desired output would be

{
   "fields": [
      "apple",
      "Banana__c"
   ],
   "Brand": "Kroger",
   "fruitNames": {
      "apple": "Apple",
      "Banana__c": "Banana"
   }
}

{(.name)[], "Brand": "Kroger", "fruitNames" .fields|map({(.name): .displayName})}
or
.result[] | (.fields | map({key: "fields.name.(.name)", value}) | from_entries)
in https://jqplay.org/# throw syntax errors. Helpful manual here: https://jqlang.github.io/jq/manual/v1.5/

3

Answers


  1. The following should work:

    jq '.result[] | {"fields": [.fields[].name], "Brand": "Kroger",
        "fruitNames": .fields|map({(.name): .displayName}) | add}' test.json
    

    {
      "fields": [
        "apple",
        "Banana__c"
      ],
      "Brand": "Kroger",
      "fruitNames": {
        "apple": "Apple",
        "Banana__c": "Banana"
      }
    }
    
    Login or Signup to reply.
  2. Here’s one way using from_entries:

    .result[].fields | map(.value = .displayName)
    | {fields: map(.name), Brand: "Kroger", fruitNames: from_entries}
    
    {
      "fields": [
        "apple",
        "Banana__c"
      ],
      "Brand": "Kroger",
      "fruitNames": {
        "apple": "Apple",
        "Banana__c": "Banana"
      }
    }
    

    Demo

    Login or Signup to reply.
  3. Or even another way:

    .result
    | map( .fields |
          {
           "fields": map(.name),
           "Brand": "Kroger",
           "fruitNames": (reduce .[] as $f ({}; . + {($f.name): $f.displayName}))
          }
         )
    

    Try it on jqplay.org.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search