Skip to content
Advertisement

Is there a way to add curly brackets around a list of dictionaries already existing within a JSON file?

I currently have two JSONS that I want to merge into one singular JSON, additionally I want to add in a slight change.

Firstly, these are the two JSONS in question.

An intents JSON:

[
{
    "ID": "G1",
    "intent": "password_reset",
    "examples": [
        {
            "text": "I forgot my password"
        },
        {
            "text": "I can't log in"
        },
        {
            "text": "I can't access the site"
        },
        {
            "text": "My log in is failing"
        },
        {
            "text": "I need to reset my password"
        }
    ]
},  
{
    "ID": "G2",
    "intent": "account_closure",
    "examples": [
        {
            "text": "I want to close my account"
        },
        {
            "text": "I want to terminate my account"
        }
    ]
},
{
    "ID": "G3",
    "intent": "account_creation",
    "examples": [
        {
            "text": "I want to open an account"
        },
        {
            "text": "Create account"
        }
    ]
},
{
    "ID": "G4",
    "intent": "complaint",
    "examples": [
        {
            "text": "A member of staff was being rude"
        },
        {
            "text": "I have a complaint"
        }
    ]
}
]

and an entities JSON:

[
{
    "ID": "K1",
    "entity": "account_type",
    "values": [
        {
            "type": "synonyms",
            "value": "business",
            "synonyms": [
                "corporate"
            ]
        },
        {
            "type": "synonyms",
            "value": "personal",
            "synonyms": [
                "vanguard",
                "student"
            ]
        }
    ]
},
{
    "ID": "K2",
    "entity": "beverage",
    "values": [
        {
            "type": "synonyms",
            "value": "hot",
            "synonyms": [
                "heated",
                "warm"
            ]
        },
        {
            "type": "synonyms",
            "value": "cold",
            "synonyms": [
                "ice",
                "freezing"
            ]
        }
    ]
}
]

The expected outcome is to create a JSON file that mimics this structure:

    {
  "intents": [
    {
      "intent": "password_reset",
      "examples": [
        {
          "text": "I forgot my password"
        },
        {
          "text": "I want to reset my password"
        }
      ],
      "description": "Reset a user password"
    }
  ],
  "entities": [
    {
      "entity": "account_type",
      "values": [
        {
          "type": "synonyms",
          "value": "business",
          "synonyms": [
            "company",
            "corporate",
            "enterprise"
          ]
        },
        {
          "type": "synonyms",
          "value": "personal",  
          "synonyms": []
        }
      ],
      "fuzzy_match": true
    }
  ],
  "metadata": {
    "api_version": {
      "major_version": "v2",
      "minor_version": "2018-11-08"
    }
  },
  "dialog_nodes": [
    {
      "type": "standard",
      "title": "anything_else",
      "output": {
        "generic": [
          {
            "values": [
              {
                "text": "I didn't understand. You can try rephrasing."
              },
              {
                "text": "Can you reword your statement? I'm not understanding."
              },
              {
                "text": "I didn't get your meaning."
              }
            ],
            "response_type": "text",
            "selection_policy": "sequential"
          }
        ]
      },
      "conditions": "anything_else",
      "dialog_node": "Anything else",
      "previous_sibling": "node_4_1655399659061",
      "disambiguation_opt_out": true
    },
    {
      "type": "event_handler",
      "output": {
        "generic": [
          {
            "title": "What type of account do you hold with us?",
            "options": [
              {
                "label": "Personal",
                "value": {
                  "input": {
                    "text": "personal"
                  }
                }
              },
              {
                "label": "Business",
                "value": {
                  "input": {
                    "text": "business"
                  }
                }
              }
            ],
            "response_type": "option"
          }
        ]
      },
      "parent": "slot_9_1655398217028",
      "event_name": "focus",
      "dialog_node": "handler_6_1655398217052",
      "previous_sibling": "handler_7_1655398217052"
    },
    {
      "type": "event_handler",
      "output": {},
      "parent": "slot_9_1655398217028",
      "context": {
        "account_type": "@account_type"
      },
      "conditions": "@account_type",
      "event_name": "input",
      "dialog_node": "handler_7_1655398217052"
    },
    {
      "type": "standard",
      "title": "business_account",
      "output": {
        "generic": [
          {
            "values": [
              {
                "text": "We have notified your corporate security team, they will be in touch to reset your password."
              }
            ],
            "response_type": "text",
            "selection_policy": "sequential"
          }
        ]
      },
      "parent": "node_3_1655397279884",
      "next_step": {
        "behavior": "jump_to",
        "selector": "body",
        "dialog_node": "node_4_1655399659061"
      },
      "conditions": "@account_type:business",
      "dialog_node": "node_1_1655399028379",
      "previous_sibling": "node_3_1655399027429"
    },
    {
      "type": "standard",
      "title": "intent_collection",
      "output": {
        "generic": [
          {
            "values": [
              {
                "text": "Thank you for confirming that you want to reset your password."
              }
            ],
            "response_type": "text",
            "selection_policy": "sequential"
          }
        ]
      },
      "next_step": {
        "behavior": "jump_to",
        "selector": "body",
        "dialog_node": "node_3_1655397279884"
      },
      "conditions": "#password_reset",
      "dialog_node": "node_3_1655396920143",
      "previous_sibling": "Welcome"
    },
    {
      "type": "frame",
      "title": "account_type_confirmation",
      "output": {
        "generic": [
          {
            "values": [
              {
                "text": "Thank you"
              }
            ],
            "response_type": "text",
            "selection_policy": "sequential"
          }
        ]
      },
      "parent": "node_3_1655396920143",
      "context": {},
      "next_step": {
        "behavior": "skip_user_input"
      },
      "conditions": "#password_reset",
      "dialog_node": "node_3_1655397279884"
    },
    {
      "type": "standard",
      "title": "personal_account",
      "output": {
        "generic": [
          {
            "values": [
              {
                "text": "We have sent you an email with a password reset link."
              }
            ],
            "response_type": "text",
            "selection_policy": "sequential"
          }
        ]
      },
      "parent": "node_3_1655397279884",
      "next_step": {
        "behavior": "jump_to",
        "selector": "body",
        "dialog_node": "node_4_1655399659061"
      },
      "conditions": "@account_type:personal",
      "dialog_node": "node_3_1655399027429"
    },
    {
      "type": "standard",
      "title": "reset_confirmation",
      "output": {
        "generic": [
          {
            "values": [
              {
                "text": "Do you need assistance with anything else today?"
              }
            ],
            "response_type": "text",
            "selection_policy": "sequential"
          }
        ]
      },
      "digress_in": "does_not_return",
      "dialog_node": "node_4_1655399659061",
      "previous_sibling": "node_3_1655396920143"
    },
    {
      "type": "slot",
      "output": {},
      "parent": "node_3_1655397279884",
      "variable": "$account_type",
      "dialog_node": "slot_9_1655398217028",
      "previous_sibling": "node_1_1655399028379"
    },
    {
      "type": "standard",
      "title": "welcome",
      "output": {
        "generic": [
          {
            "values": [
              {
                "text": "Hello. How can I help you?"
              }
            ],
            "response_type": "text",
            "selection_policy": "sequential"
          }
        ]
      },
      "conditions": "welcome",
      "dialog_node": "Welcome"
    }
  ],
  "counterexamples": [],
  "system_settings": {
    "off_topic": {
      "enabled": true
    },
    "disambiguation": {
      "prompt": "Did you mean:",
      "enabled": true,
      "randomize": true,
      "max_suggestions": 5,
      "suggestion_text_policy": "title",
      "none_of_the_above_prompt": "None of the above"
    },
    "human_agent_assist": {
      "prompt": "Did you mean:"
    },
    "intent_classification": {
      "training_backend_version": "v2"
    },
    "spelling_auto_correct": true
  },
  "learning_opt_out": false,
  "name": "Reset Password",
  "language": "en",
  "description": "Basic Password Reset Request"

    }

So what I am missing in my original files, is essentially:

"intents":

and for the entities file:

"entities"

at the start of each list of dictionaries.

Additionally, I would need to wrap the whole thing in curly braces to comply with json formatting.

As seen, the final goal is not just appending these two to one another but the file technically continues with some other JSON code that I have yet to write and deal with.

My question now is as follows; by what method can I either add in these words and the braces to the individual files, then combine them into a singular JSON or alternatively by what method can I read in these files and combine them with the changes all in one go?

The new output file closing on a curly brace after the entities list of dicts is an acceptable outcome for me at the time, so that I can continue to make changes and hopefully further learn from this how to do these changes in future when I get there.

TIA

Advertisement

Answer

JSON is only a string format, you can it load in a language structure, in python that is list and dict, do what you need then dump it back, so you don’t “add strings” and “add brackets”, on modify the structure

file = 'intents.txt'
intents = json.load(open(file)) # load a list

file = 'entities.txt'
entities = json.load(open(file)) # load a list

# create a dict
content = {
    "intents": intents,
    "entities": entities
}

json.dump(content, open(file, "w"))
User contributions licensed under: CC BY-SA
7 People found this is helpful
Advertisement