'How can I sort a JSON file by an attribute in asec order?

I have two JSON files to compare, and one of the outputs isn't in the right order. In order to compare a json file with another, I need to sort it by the name attribute. However, I encountered many difficulties. Can anyone help me solve this issue?

Or Is there any way to sort the JsonFile 1 by attribute "name" is ascending order ( Expected output- JsonFile2)

I tried with jq -s .Json.json > out.json, No outputs. can I know how to pass thee jq to sort by attribute name ?

JsonFile1:

{
  "responseStatus": "SUCCESS",
  "data": {
    "name": "reusable_text__v",
    "object": "annotation_keywords__sys",
    "label": "Reusable Text",
    "label_plural": "Reusable Text",
    "active": true,
    "additional_type_validations": [],
    "type_fields": [{
        "required": true,
        "source": "standard",
        "name": "reusable_text_content__v"
      },
      {
        "required": false,
        "source": "standard",
        "name": "reusable_text_type__v"
      },
      {
        "required": false,
        "source": "standard",
        "name": "source_text_asset__v"
      },
      {
        "required": false,
        "source": "standard",
        "name": "country__v"
      },
      {
        "required": false,
        "source": "standard",
        "name": "create_from_annotation_id__sys"
      },
      {
        "required": false,
        "source": "standard",
        "name": "create_from_annotation_source__sys"
      },
      {
        "required": false,
        "source": "standard",
        "name": "product__v"
      },
      {
        "required": false,
        "source": "standard",
        "name": "id"
      },
      {
        "required": true,
        "source": "standard",
        "name": "name__v"
      },
      {
        "required": true,
        "source": "standard",
        "name": "status__v"
      },
      {
        "required": false,
        "source": "standard",
        "name": "created_by__v"
      },
      {
        "required": false,
        "source": "standard",
        "name": "created_date__v"
      },
      {
        "required": false,
        "source": "standard",
        "name": "modified_by__v"
      },
      {
        "required": false,
        "source": "standard",
        "name": "modified_date__v"
      },
      {
        "required": false,
        "source": "system",
        "name": "global_id__sys"
      },
      {
        "required": false,
        "source": "system",
        "name": "link__sys"
      },
      {
        "required": false,
        "source": "standard",
        "name": "object_type__v"
      },
      {
        "required": true,
        "source": "custom",
        "name": "lifecycle__v"
      },
      {
        "required": true,
        "source": "custom",
        "name": "state__v"
      },
      {
        "required": false,
        "source": "custom",
        "name": "create_from_annotation_source_unbound__sys"
      },
      {
        "required": false,
        "source": "system",
        "name": "state_stage_id__sys"
      },
      {
        "required": false,
        "source": "system",
        "name": "stage__sys"
      }
    ]
  }
}

JsonFile2: (I need to sort previous json format by the name attribute in ascending order)

{
  "responseStatus": "SUCCESS",
  "data": {
    "name": "reusable_text__c",
    "object": "annotation_keywords__sys",
    "label": "Reusable Text Asset",
    "label_plural": "Reusable Text Assets",
    "active": true,
    "additional_type_validations": [],
    "type_fields": [{
        "required": false,
        "source": "standard",
        "name": "id"
      },
      {
        "required": false,
        "source": "standard",
        "name": "object_type__v"
      },
      {
        "required": true,
        "source": "standard",
        "name": "name__v"
      },
      {
        "required": true,
        "source": "standard",
        "name": "status__v"
      },
      {
        "required": false,
        "source": "standard",
        "name": "created_by__v"
      },
      {
        "required": false,
        "source": "standard",
        "name": "created_date__v"
      },
      {
        "required": false,
        "source": "standard",
        "name": "modified_by__v"
      },
      {
        "required": false,
        "source": "standard",
        "name": "modified_date__v"
      },
      {
        "required": false,
        "source": "system",
        "name": "global_id__sys"
      },
      {
        "required": false,
        "source": "system",
        "name": "link__sys"
      },
      {
        "required": true,
        "source": "custom",
        "name": "lifecycle__v"
      },
      {
        "required": true,
        "source": "custom",
        "name": "state__v"
      },
      {
        "required": true,
        "source": "custom",
        "name": "match_text__sys"
      },
      {
        "required": false,
        "source": "system",
        "name": "state_stage_id__sys"
      },
      {
        "required": false,
        "source": "system",
        "name": "stage__sys"
      },
      {
        "required": true,
        "source": "custom",
        "name": "reusable_text_content__c"
      },
      {
        "required": false,
        "source": "custom",
        "name": "create_from_annotation_source__sys"
      },
      {
        "required": false,
        "source": "custom",
        "name": "create_from_annotation_id__sys"
      },
      {
        "required": false,
        "source": "custom",
        "name": "reusable_text_type__c"
      },
      {
        "required": false,
        "source": "custom",
        "name": "country__v"
      },
      {
        "required": false,
        "source": "custom",
        "name": "product__v"
      },
      {
        "required": false,
        "source": "custom",
        "name": "create_from_annotation_source_unbound__sys"
      },
      {
        "required": false,
        "source": "custom",
        "name": "source_text_asset__c"
      }
    ]
  }
}

I tried JsonArray and JsonObject, but did not succeed in finding the correct solution



Solution 1:[1]

You can sort the array located at .data.type_fields by its object items' field .name using sort_by and the update operator |=.

jq '.data.type_fields |= sort_by(.name)' JsonFile1 > JsonFile2

Demo

However, when sorting your sample JsonFile1 that way, the resulting JSON does not look like your sample JsonFile2.

{
  "responseStatus": "SUCCESS",
  "data": {
    "name": "reusable_text__v",
    "object": "annotation_keywords__sys",
    "label": "Reusable Text",
    "label_plural": "Reusable Text",
    "active": true,
    "additional_type_validations": [],
    "type_fields": [
      {
        "required": false,
        "source": "standard",
        "name": "country__v"
      },
      {
        "required": false,
        "source": "standard",
        "name": "create_from_annotation_id__sys"
      },
      {
        "required": false,
        "source": "standard",
        "name": "create_from_annotation_source__sys"
      },
      {
        "required": false,
        "source": "custom",
        "name": "create_from_annotation_source_unbound__sys"
      },
      {
        "required": false,
        "source": "standard",
        "name": "created_by__v"
      },
      {
        "required": false,
        "source": "standard",
        "name": "created_date__v"
      },
      {
        "required": false,
        "source": "system",
        "name": "global_id__sys"
      },
      {
        "required": false,
        "source": "standard",
        "name": "id"
      },
      {
        "required": true,
        "source": "custom",
        "name": "lifecycle__v"
      },
      {
        "required": false,
        "source": "system",
        "name": "link__sys"
      },
      {
        "required": false,
        "source": "standard",
        "name": "modified_by__v"
      },
      {
        "required": false,
        "source": "standard",
        "name": "modified_date__v"
      },
      {
        "required": true,
        "source": "standard",
        "name": "name__v"
      },
      {
        "required": false,
        "source": "standard",
        "name": "object_type__v"
      },
      {
        "required": false,
        "source": "standard",
        "name": "product__v"
      },
      {
        "required": true,
        "source": "standard",
        "name": "reusable_text_content__v"
      },
      {
        "required": false,
        "source": "standard",
        "name": "reusable_text_type__v"
      },
      {
        "required": false,
        "source": "standard",
        "name": "source_text_asset__v"
      },
      {
        "required": false,
        "source": "system",
        "name": "stage__sys"
      },
      {
        "required": true,
        "source": "custom",
        "name": "state__v"
      },
      {
        "required": false,
        "source": "system",
        "name": "state_stage_id__sys"
      },
      {
        "required": true,
        "source": "standard",
        "name": "status__v"
      }
    ]
  }
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 pmf