Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to loop different types of nested JSON objects multiple times in the same message

Python noob here, again. I'm trying to create a python script to auto-generate a JSON with multiple item but records multiple times using a for loop to generate them, the JSON message is structured and cardinality are as follows:

messageHeader[1]
-item [1-*]
--itemAttributesA [0-1]
--itemAttributesB [0-1]
--itemAttributesC [0-1]
--itemLocaton [1]
--itemRelationships [0-1] 

I've had some really good help before for looping through the same object but for one record for example just the itemRelationships record. However as soon as I try to create one message with many items (i.e. 5) and a single instance of an itemAttribute, itemLocation and itemRelationships it does not work as I keep getting a key error. I've tried to define what a keyError is in relation to what I am trying to do but cannot link what I am doing wrong to the examples else where.

Here's my code as it stands:

import json
import random

data = {'messageID': random.randint(0, 2147483647), 'messageType': 'messageType'}
data['item'] = list()

itemAttributeType = input("Please selct what type of Attribute item has, either 'A', 'B' or 'C' :")

for x in range(0, 5):
    data['item'].append({
        'itemId': "I",
        'itemType': "T"})

    if itemAttributeType == "A":
        data['item'][0]['itemAttributesA']

        data['item'][0]['itemAttributesA'].append({
            'attributeA': "ITA"})

    elif itemAttributeType == "B":
        data['item'][0]['itemAttributesB']

        data['item'][0]['itemAttributesB'].append({
            'attributeC': "ITB"})

    else:
        data['item'][0]['itemAttributesC']

        data['item'][0]['itemAttributesC'].append({
            'attributeC': "ITC"})
        pass

data['item'][0]['itemLocation'] = {
        'itemDetail': "ITC"}

itemRelation = input("Does the item have a relation: ")
if itemRelation > '':
    data['item'][0]['itemRelations'] = {
        'itemDetail': "relation"}
else:
    pass

print(json.dumps(data, indent=4))

I have tried also tried this code which gives me better results:

import json
import random

data = {'messageID': random.randint(0, 2147483647), 'messageType': 'messageType'}
data['item'] = list()

itemAttributeType = input("Please selct what type of Attribute item has, either 'A', 'B' or 'C' :")

for x in range(0, 5):
    data['item'].append({
        'itemId': "I",
        'itemType': "T"})

    if itemAttributeType == "A":
        data['item'][0]['itemAttributesA'] = {
            'attributeA': "ITA"}

    elif itemAttributeType == "B":
        data['item'][0]['itemAttributesB'] = {
            'attributeB': "ITB"}

    else:
        data['item'][0]['itemAttributesC'] = {
            'attributeC': "ITC"}
        pass

data['item'][0]['itemLocation'] = {
        'itemDetail': "ITC"}

itemRelation = input("Does the item have a relation: ")
if itemRelation > '':
    data['item'][0]['itemRelations'] = {
        'itemDetail': "relation"}
else:
    pass

print(json.dumps(data, indent=4))

This actually gives me a result but gives me messageHeader, item, itemAttributeA, itemLocation, itemRelations, and then four items records at the end as follows:

{
    "messageID": 1926708779,
    "messageType": "messageType",
    "item": [
        {
            "itemId": "I",
            "itemType": "T",
            "itemAttributesA": {
                "itemLocationType": "ITA"
            },
            "itemLocation": {
                "itemDetail": "location"
            },
            "itemRelations": {
                "itemDetail": "relation"
            }
        },
        {
            "itemId": "I",
            "itemType": "T"
        },
        {
            "itemId": "I",
            "itemType": "T"
        },
        {
            "itemId": "I",
            "itemType": "T"
        },
        {
            "itemId": "I",
            "itemType": "T"
        }
    ]
}

What I am trying to achieve is this output:

{
    "messageID": 2018369867,
    "messageType": "messageType",
    "item": [{
        "itemId": "I",
        "itemType": "T",
        "itemAttributesA": {
            "attributeA": "ITA"
        },
        "itemLocation": {
            "itemDetail": "Location"
        },
        "itemRelation": [{
            "itemDetail": "D"
        }]
    }, {
        "item": [{
            "itemId": "I",
            "itemType": "T",
            "itemAttributesB": {
                "attributeA": "ITB"
            },
            "itemLocation": {
                "itemDetail": "Location"
            },
            "itemRelation": [{
                "itemDetail": "D"
            }]
        }, {
            "item": [{
                "itemId": "I",
                "itemType": "T",
                "itemAttributesC": {
                    "attributeA": "ITC"
                },
                "itemLocation": {
                    "itemDetail": "Location"
                },
                "itemRelation": [{
                    "itemDetail": "D"
                }]
            }, {
                "item": [{
                        "itemId": "I",
                        "itemType": "T",
                        "itemAttributesA": {
                            "attributeA": "ITA"
                        },
                        "itemLocation": {
                            "itemDetail": "Location"
                        },
                        "itemRelation": [{
                            "itemDetail": "D"
                        }]
                    },
                    {
                        "item": [{
                            "itemId": "I",
                            "itemType": "T",
                            "itemAttributesB": {
                                "attributeA": "ITB"
                            },
                            "itemLocation": {
                                "itemDetail": "Location"
                            },
                            "itemRelation": [{
                                "itemDetail": "D"
                            }]
                        }]
                    }
                ]
            }]
        }]
    }]
}

I've been at this for the best part of a whole day trying to get it to work, butchering away at code, where am I going wrong, any help would be greatly appreciated

like image 475
ra67052 Avatar asked Nov 07 '22 18:11

ra67052


1 Answers

Your close. I think the part your are missing is adding the dict to your current dict and indentation with your for loop.

import json
import random

data = {'messageID': random.randint(0, 2147483647), 'messageType': 'messageType'}
data['item'] = list()

itemAttributeType = input("Please selct what type of Attribute item has, either 'A', 'B' or 'C' :")

for x in range(0, 5):
    data['item'].append({
        'itemId': "I",
        'itemType': "T"})

    if itemAttributeType == "A":
        # First you need to add `itemAttributesA` to your dict:
        data['item'][x]['itemAttributesA'] = dict()
        # You could also do data['item'][x] = {'itemAttributesA': = dict()}

        data['item'][x]['itemAttributesA']['attributeA'] = "ITA"
    elif itemAttributeType == "B":
        data['item'][x]['itemAttributesB'] = dict()

        data['item'][x]['itemAttributesB']['attributeC'] = "ITB"

    else:
        data['item'][x]['itemAttributesC'] = dict()
        data['item'][x]['itemAttributesC']['attributeC'] = "ITC"

    data['item'][x]['itemLocation'] = {'itemDetail': "ITC"}

    itemRelation = input("Does the item have a relation: ")
    if itemRelation > '':
        data['item'][x]['itemRelations'] = {'itemDetail': "relation"}
    else:
        pass

print(json.dumps(data, indent=4))

This code can also be shortened considerably if your example is close to what you truly desire:

import json
import random

data = {'messageID': random.randint(0, 2147483647), 'messageType': 'messageType'}
data['item'] = list()

itemAttributeType = input("Please selct what type of Attribute item has, either 'A', 'B' or 'C' :")

for x in range(0, 5):
    new_item = {
        'itemId': "I",
        'itemType': "T",
        'itemAttributes' + str(itemAttributeType): {
            'attribute' + str(itemAttributeType): "IT" + str(itemAttributeType)
        },
        'itemLocation': {'itemDetail': "ITC"}
    }

    itemRelation = input("Does the item have a relation: ")
    if itemRelation > '':
        new_item['itemRelations'] = {'itemDetail': itemRelation}
    data['item'].append(new_item)

print(json.dumps(data, indent=4))

Another note: If you want messageID to be truly unique than you should probably look into a UUID; otherwise you may have message ids that match.

import uuid
unique_id = str(uuid.uuid4())
print(unique_id)
like image 164
Error - Syntactical Remorse Avatar answered Nov 12 '22 14:11

Error - Syntactical Remorse