How to split a json key containing a colon into 2 keys

I receive some json data which sometimes start with the first key within “json_data” variable containing a ‘:’, such as:

`

“json_data”: {
“key1:key2”: {
“key3”: [
“value31”,
“value32”,
“…”
]
}
}

`

The goal is to split “key1:key2” into 2 keys so that we end up with:

`

“json_data”: {
“key1”: {
“key2”: {
“key3”: [
“value31”,
“value32”,
“…”
]
}
}
}

`

The key names are completely variable so I also have no idea about how to implement the play condition so that this transformation is done only when the first key within “json_data” contains a single colon.

I am aware that a colon should not be part of any key, but I have no control over that.

Any suggestion?

Try this

   - set_fact:
        json_data1: "{{ json_data1|default({})|combine(my_key) }}"
      vars:
        my_keys: "{{ item.key.split(':') }}"
        my_keys_length: "{{ my_keys|length == 1 }}"
        my_key: "{{ my_keys_length|
                    ternary({my_keys[0]: item.value},
                            {my_keys[0]: {my_keys[1:]|join(':')|default('NA'):
                                         item.value}}) }}"
      loop: "{{ json_data|dict2items }}"

HTH,

  -vlado

I’m impressed. It works perfectly. Only the first key is split as expected…