cookandy
cookandy

Reputation: 1055

Adding all elements from list into json dict

I have a list with a couple nested elements in it. For example:

list=[{'new1': {'foo': [{'type': 'foo', 'foo': {'content': 'foo'}}]}},
     {'new2': {'bar': [{'type': 'bar', 'bar': {'content': 'bar'}}]}}]

I also have a dict for some json data I need to submit via requests.

For example, this works just fine

json_data={
  "parent": { "foo": "bar" },
  "children": [
      {'existing1': {'foo': [{'type': 'foo', 'foo': {'content': 'foo'}}]}},
      {'existing2': {'foo': [{'type': 'foo', 'foo': {'content': 'foo'}}]}}
  ]
}

requests.post(url, headers=common_headers, data=json.dumps(json_data))

What I'm trying to do is add all elements from the list into the json_data. For example, if I add a single element from the list, it works fine

json_data={
  "parent": { "foo": "bar" },
  "children": [
      {'existing1': {'foo': [{'type': 'foo', 'foo': {'content': 'foo'}}]}},
      {'existing2': {'foo': [{'type': 'foo', 'foo': {'content': 'foo'}}]}},
      list[0]
  ]
}

Because it turns into this

json_data={
  "parent": { "foo": "bar" },
  "children": [
      {'existing1': {'foo': [{'type': 'foo', 'foo': {'content': 'foo'}}]}},
      {'existing2': {'foo': [{'type': 'foo', 'foo': {'content': 'foo'}}]}},
      {'new1': {'foo': [{'type': 'foo', 'foo': {'content': 'foo'}}]}}
  ]
}

However, if I add the entire list, it includes the brackets [] and fails. For example, this:

json_data={
  "parent": { "foo": "bar" },
  "children": [
      {'existing1': {'foo': [{'type': 'foo', 'foo': {'content': 'foo'}}]}},
      {'existing2': {'foo': [{'type': 'foo', 'foo': {'content': 'foo'}}]}},
      list
  ]
}

Turns into

json_data={
  "parent": { "foo": "bar" },
  "children": [
      {'existing1': {'foo': [{'type': 'foo', 'foo': {'content': 'foo'}}]}},
      {'existing2': {'foo': [{'type': 'foo', 'foo': {'content': 'foo'}}]}},
      [
          {'new1': {'foo': [{'type': 'foo', 'foo': {'content': 'foo'}}]}},
          {'new2': {'bar': [{'type': 'bar', 'bar': {'content': 'bar'}}]}}
      ]
  ]
}

The square brackets are breaking the request. Because I don't know how many elements will be in the list, I can't define which element to use (like in the first example).

Is there an easy way for me to include all elements of the list, without the square brackets?

Thank you.

Upvotes: 0

Views: 106

Answers (4)

Adon Bilivit
Adon Bilivit

Reputation: 26915

Slightly different to other answers as this allows for more entries in the original list:

list_ = [{'new1': {'foo': [{'type': 'foo', 'foo': {'content': 'foo'}}]}},
         {'new2': {'bar': [{'type': 'bar', 'bar': {'content': 'bar'}}]}}]

json_data = {"parent": {"foo": "bar"}, "children": []}

for dl in list_:
    for i, v in enumerate(dl.values(), 1):
        json_data["children"].append({f'existing{i}': v})

print(json_data)

Output:

{'parent': {'foo': 'bar'}, 'children': [{'existing1': {'foo': [{'type': 'foo', 'foo': {'content': 'foo'}}]}}, {'existing1': {'bar': [{'type': 'bar', 'bar': {'content': 'bar'}}]}}]}

Upvotes: 0

ParisNakitaKejser
ParisNakitaKejser

Reputation: 14839

A quick and simple way to keep it, from Python 3.9 (i mean) you can use *list to extend it on the fly, like this code here.

json_data={
  "parent": { "foo": "bar" },
  "children": [
      {'existing1': {'foo': [{'type': 'foo', 'foo': {'content': 'foo'}}]}},
      {'existing2': {'foo': [{'type': 'foo', 'foo': {'content': 'foo'}}]}},
      *list
  ]
}

its return a dict like this.

{
    'parent': {
        'foo': 'bar'
    },
    'children': [{
        'existing1': {
            'foo': [{
                'type': 'foo',
                'foo': {
                    'content': 'foo'
                }
            }]
        }
    }, {
        'existing2': {
            'foo': [{
                'type': 'foo',
                'foo': {
                    'content': 'foo'
                }
            }]
        }
    }, {
        'new1': {
            'foo': [{
                'type': 'foo',
                'foo': {
                    'content': 'foo'
                }
            }]
        }
    }, {
        'new2': {
            'bar': [{
                'type': 'bar',
                'bar': {
                    'content': 'bar'
                }
            }]
        }
    }]
}

Upvotes: 1

hyunjun
hyunjun

Reputation: 21

There is one simple way

only use '+'

ex)

    json_data={
  "parent": { "foo": "bar" },
  "children": [
      {'existing1': {'foo': [{'type': 'foo', 'foo': {'content': 'foo'}}]}},
      {'existing2': {'foo': [{'type': 'foo', 'foo': {'content': 'foo'}}]}}
  ]
}

and have a list that I want to add

list_ =      [
          {'new1': {'foo': [{'type': 'foo', 'foo': {'content': 'foo'}}]}},
          {'new2': {'bar': [{'type': 'bar', 'bar': {'content': 'bar'}}]}}
      ]

and

json_data['children'] += list_

result

[{'existing1': {'foo': [{'foo': {'content': 'foo'}, 'type': 'foo'}]}},
 {'existing2': {'foo': [{'foo': {'content': 'foo'}, 'type': 'foo'}]}},
 {'new1': {'foo': [{'foo': {'content': 'foo'}, 'type': 'foo'}]}},
 {'new2': {'bar': [{'bar': {'content': 'bar'}, 'type': 'bar'}]}}]

Upvotes: 0

azro
azro

Reputation: 54148

You need to unpack the list into its destination

json_data = {
    "parent": {"foo": "bar"},
    "children": [
        {'existing1': {'foo': [{'type': 'foo', 'foo': {'content': 'foo'}}]}},
        {'existing2': {'foo': [{'type': 'foo', 'foo': {'content': 'foo'}}]}},
        *values
    ]
}

Or use list.extend

json_data = {
    "parent": {"foo": "bar"},
    "children": [
        {'existing1': {'foo': [{'type': 'foo', 'foo': {'content': 'foo'}}]}},
        {'existing2': {'foo': [{'type': 'foo', 'foo': {'content': 'foo'}}]}},
    ]
}
json_data['children'].extend(values)

Don't use builtin list keyword for your variable, that's the list constructor

Upvotes: 0

Related Questions