Home > Enterprise >  Assign variable value in JSON payload fomat
Assign variable value in JSON payload fomat

Time:12-30

I am using python 3.6.3a. I would like to generate payload for each of the json records. I am using each variable to access the record. How to assign variable value (each in this case) in payload? I tried {each} and other methods but didn't work.

code snippet below.

json_records =  [{"description":"<p>This is scenario1<\/p>","owner":"deb",
                  "priority":"high"},
                 {"description":"<p>This is scenario2<\/p>","owner":"deb",
                  "priority":"medium"}]

json_object = json.loads(json_records)

for each in json_object:
   payload = """
   {
     "subject": "test",
     "fieldValues": [
         {each}
      ]
   }
   """

CodePudding user response:

There are two ways to approach this problem. One way could be creating a dict() object and inserting keys as you wish, then json.dumps(object) to convert into string payload as in:

import json
json_records = [{"description":"This is scenario1</p>","owner":"deb","priority":"high"}
,{"description":"This is scenario2</p>","owner":"deb","priority":"medium"}]

for obj in json_records:
    payload =  dict()
    payload['subject'] = 'test'
    for key,value in obj.items():
        payload['fieldName'] = {
            key:value
        }
    print(json.dumps(payload))
#{"subject": "test", "fieldName": {"priority": "high"}}
#{"subject": "test", "fieldName": {"priority": "medium"}}

Second way is to create a textual payload from string as in, however if you need a valid JSON at the end, this would require a post-step of validation (something like try json.loads(payload) - So I'd just use the first method. I would use this method only if I have a specific requirements to generate the payload in a certain way.

import json
json_records = [{"description":"This is scenario1</p>","owner":"deb","priority":"high"}
,{"description":"This is scenario2</p>","owner":"deb","priority":"medium"}]

# json_object = json.loads(json_records) # json.loads works only on byte-like strings. your object is already in python in this case.

for obj in json_records:
    payload =  """
   {
     "subject": "test",
     "fieldValues": [ 
         %s 
      ]
   }
   """ % (obj["priority"])
    print(payload)
#{
#     "subject": "test",
#     "fieldValues": [ 
#         high 
#      ]
#   }
#   
#
#   {
#     "subject": "test",
#     "fieldValues": [ 
#         medium 
#      ]
#   }
 

CodePudding user response:

You could make payload a Template string and use it to put the data in each JSON record into the format you want. Bracket {} characters have not special meaning in Templates, which is what makes using them easy.

Doing that will create a valid string representation of a dictionary containing everything. You can turn this into an actual Python dictionary data-structure using the ast.literal_eval() function, and then convert that into JSON string format — which I think is the final format you're after.

rom ast import literal_eval
import json
from string import Template
from textwrap import dedent


json_records = '''[{"description":"<p>This is scenario1<\/p>","owner":"deb",
                    "priority":"high"},
                    {"description":"<p>This is scenario2<\/p>","owner":"deb",
                     "priority":"medium"}]'''

json_object = json.loads(json_records)

payload = Template(dedent("""
    {
      "subject": "test",
      "fieldValues": [
          $each
       ]
    }""")
)

for each in json_object:
    obj = literal_eval(payload.substitute(dict(each=each)))
    print(json.dumps(obj, indent=2))

Output:

{
  "subject": "test",
  "fieldValues": [
    {
      "description": "<p>This is scenario1</p>",
      "owner": "deb",
      "priority": "high"
    }
  ]
}
{
  "subject": "test",
  "fieldValues": [
    {
      "description": "<p>This is scenario2</p>",
      "owner": "deb",
      "priority": "medium"
    }
  ]
}
  • Related