How to parameterize JSON object in a Python script - python
I am writing a test in Python where i am specifying the JSON sting in a parameter as follows :
json = '...[{"MemberOperand":{
"AttributeName":"TEST",
"Comparison":"=",
"Value":"Test"}
}]...'
In this example i have the value as "Test" however i want to run the test with several values. Could you guys tell me how can i parameterize The values of "Value"?
You can construct proper JSON:
import json
the_value = 'Test'
data = [{"MemberOperand": {
"AttributeName":"TEST",
"Comparison":"=",
"Value": the_value}
}]
json_text = json.dumps(data)
This is regular dictionary (nested) formatted as string -
def changer(x):
import json
d=json.loads(json.loads(json.dumps('[{"MemberOperand":{"AttributeName":"TEST","Comparison":"=","Value":"Test"}}]')))
d[0]['MemberOperand']['AttributeName']=x
return d
print changer('New_TEST')
Output-
[{'MemberOperand': {'Comparison': '=', 'AttributeName': 'New_TEST', 'Value': 'Test'}}]
Add function which return you different json string all the time by provided value as parameter:
def get_mock_json(value='Test'):
return '...[{"MemberOperand":{"AttributeName":"TEST","Comparison":"=","Value":%s}}]...'%value
print get_mock_json('test')
print get_mock_json('ttttttest')
Related
How to add string in specific positions in geojson object
i have the below posted geojson mentioned in geojson_1 section below. i want to add to it "geometry":{ and }, so that to appear as follows {"geometry":{"type":"Polygon","coordinates":[[[1216374.67364018,6563498.44078949],[1216387.86261675,6563523.87797899],[1216397.66970116,6563548.2905649],[1216424.17569103,6563588.32082324],[1216458.19258303,6563622.16452455],[1216498.32084288,6563648.42909789],[1216542.90943577,6563666.03380959],[1216590.12376481,6563674.25425166],[1216638.02117068,6563672.7521636],[1216684.63088244,6563661.58935797],[1216728.03512655,6563641.225175],[1216752.29181681,6563626.67066235],[1216787.17700448,6563601.12371718],[1216816.83970763,6563569.63465531],[1216831.39332728,6563551.03748989],[1216838.2508451,6563541.8226918],[1216897.47283376,6563458.0765492],[1216918.74007329,6563421.44644481],[1216933.156564,6563381.60258193],[1216940.26085904,6563339.82061228],[1216939.82562707,6563297.43819918],[1216931.86491641,6563255.81218836],[1216907.60647856,6563170.91644364],[1216887.20280767,6563121.46139137],[1216856.24799209,6563077.86160203],[1216821.48046704,6563039.0529759],[1216799.23490474,6563017.28929875],[1216753.95673639,6562978.48086898],[1216737.29066155,6562965.4435638],[1216673.22488836,6562919.79826372],[1216644.73178636,6562899.22061724],[1216601.13622245,6562874.31962206],[1216562.32695185,6562857.3410734],[1216556.56069412,6562854.90900462],[1216549.97837146,6562852.23502385],[1216545.77480552,6562849.58841453],[1216504.75306873,6562829.03095075],[1216487.0229317,6562822.21187019],[1216482.65368148,6562820.3796627],[1216478.79578194,6562814.49158384],[1216462.95127963,6562793.04723497],[1216450.44559886,6562777.97698661],[1216448.65520854,6562774.19751598],[1216429.39331353,6562740.84427663],[1216404.99213055,6562711.06486155],[1216382.3528849,6562687.61801865],[1216357.97638417,6562665.64947943],[1216339.38004804,6562651.09634054],[1216299.24217837,6562625.743469],[1216254.86196793,6562608.94292463],[1216208.02902037,6562601.37212065],[1216160.63182011,6562603.33631786],[1216114.58159971,6562614.75632195],[1216071.73529105,6562635.17167463],[1216033.82066317,6562663.75921023],[1216002.36666225,6562699.36623124],[1215978.64176027,6562740.55696848],[1215963.60279766,6562785.67045603],[1215957.85638339,6562832.88749107],[1215961.63441126,6562880.30398198],[1215963.25125904,6562889.19806131],[1215964.03213898,6562893.28933659],[1215968.1319511,6562913.79137984],[1215972.03222389,6562937.19708669],[1215977.28745991,6563016.79645952],[1215971.45390521,6563048.0427099],[1215969.39172682,6563061.09023781],[1215963.73069651,6563104.75131293],[1215962.06592533,6563123.22251112],[1215960.00953034,6563163.6421848],[1215954.35640427,6563213.80082903],[1215954.63230125,6563269.34572034],[1215960.29082704,6563315.43307246],[1215970.70253119,6563361.57391952],[1215982.82982632,6563397.95907391],[1216001.20120538,6563439.38870108],[1216027.10825421,6563476.54992802],[1216059.60193364,6563508.08124916],[1216097.4918555,6563532.82739871],[1216139.38989254,6563549.8816932],[1216183.76104002,6563558.61926572],[1216228.97966418,6563558.71997125],[1216273.38907516,6563550.18012236],[1216287.1346647,6563546.13717455],[1216332.92682121,6563527.24586381],[1216373.78586258,6563499.1986745],[1216374.67364018,6563498.44078949]]]}} to simpify it even more, i want to add "geometry":{ right after the the first curly bracket, and the } at the very end i attmepted the following: asString = asString[:2] + "geometry:" + asString[2:] asString = asString[:len(asString)] + "}" + asString[len(asString):] but i am not getting the expected results geojson_1: {"type":"Polygon","coordinates":[[[1216374.67364018,6563498.44078949],[1216387.86261675,6563523.87797899],[1216397.66970116,6563548.2905649],[1216424.17569103,6563588.32082324],[1216458.19258303,6563622.16452455],[1216498.32084288,6563648.42909789],[1216542.90943577,6563666.03380959],[1216590.12376481,6563674.25425166],[1216638.02117068,6563672.7521636],[1216684.63088244,6563661.58935797],[1216728.03512655,6563641.225175],[1216752.29181681,6563626.67066235],[1216787.17700448,6563601.12371718],[1216816.83970763,6563569.63465531],[1216831.39332728,6563551.03748989],[1216838.2508451,6563541.8226918],[1216897.47283376,6563458.0765492],[1216918.74007329,6563421.44644481],[1216933.156564,6563381.60258193],[1216940.26085904,6563339.82061228],[1216939.82562707,6563297.43819918],[1216931.86491641,6563255.81218836],[1216907.60647856,6563170.91644364],[1216887.20280767,6563121.46139137],[1216856.24799209,6563077.86160203],[1216821.48046704,6563039.0529759],[1216799.23490474,6563017.28929875],[1216753.95673639,6562978.48086898],[1216737.29066155,6562965.4435638],[1216673.22488836,6562919.79826372],[1216644.73178636,6562899.22061724],[1216601.13622245,6562874.31962206],[1216562.32695185,6562857.3410734],[1216556.56069412,6562854.90900462],[1216549.97837146,6562852.23502385],[1216545.77480552,6562849.58841453],[1216504.75306873,6562829.03095075],[1216487.0229317,6562822.21187019],[1216482.65368148,6562820.3796627],[1216478.79578194,6562814.49158384],[1216462.95127963,6562793.04723497],[1216450.44559886,6562777.97698661],[1216448.65520854,6562774.19751598],[1216429.39331353,6562740.84427663],[1216404.99213055,6562711.06486155],[1216382.3528849,6562687.61801865],[1216357.97638417,6562665.64947943],[1216339.38004804,6562651.09634054],[1216299.24217837,6562625.743469],[1216254.86196793,6562608.94292463],[1216208.02902037,6562601.37212065],[1216160.63182011,6562603.33631786],[1216114.58159971,6562614.75632195],[1216071.73529105,6562635.17167463],[1216033.82066317,6562663.75921023],[1216002.36666225,6562699.36623124],[1215978.64176027,6562740.55696848],[1215963.60279766,6562785.67045603],[1215957.85638339,6562832.88749107],[1215961.63441126,6562880.30398198],[1215963.25125904,6562889.19806131],[1215964.03213898,6562893.28933659],[1215968.1319511,6562913.79137984],[1215972.03222389,6562937.19708669],[1215977.28745991,6563016.79645952],[1215971.45390521,6563048.0427099],[1215969.39172682,6563061.09023781],[1215963.73069651,6563104.75131293],[1215962.06592533,6563123.22251112],[1215960.00953034,6563163.6421848],[1215954.35640427,6563213.80082903],[1215954.63230125,6563269.34572034],[1215960.29082704,6563315.43307246],[1215970.70253119,6563361.57391952],[1215982.82982632,6563397.95907391],[1216001.20120538,6563439.38870108],[1216027.10825421,6563476.54992802],[1216059.60193364,6563508.08124916],[1216097.4918555,6563532.82739871],[1216139.38989254,6563549.8816932],[1216183.76104002,6563558.61926572],[1216228.97966418,6563558.71997125],[1216273.38907516,6563550.18012236],[1216287.1346647,6563546.13717455],[1216332.92682121,6563527.24586381],[1216373.78586258,6563499.1986745],[1216374.67364018,6563498.44078949]]]}
I'm going to assume that geojson_1 is available as a string in which case: import json output = {'geometry': json.loads(geojson_1)} ...will give you a dictionary with the structure you need.
It looks like plain json data, or a string representation of a dict (they wouldn't be any different in this case), did you consider wrapping the returned data in a new dict rather than manipulating it as a string? import json # Assume this returns the geojson as text geojson = json.loads(get_geojson()) geojson = {"geometry": geojson} print(json.dumps(geojson))
I get the expected result using the following: '{"geometry":' + d + "}" It adds the string {"geometry": to the string d and at the end }. The variable dis: d = '{"type":"Polygon","co (rest of json) ,6563498.44078949]]]}' Or you can use the json library for this: import json data = json.loads(d) # note d is the same string as above, this can also be from a file or read file using json.load(FILE) # Create your new object: result = {'geometry': data} # print you new json: print( json.dumps(result, indent=2)) edit: '"geometry":{' + d + "}" Note that you get a string starting with geometry and a { and directly another { from you input json. This is not a correct dictionary nor a proper json format. Result: '"geometry":{{"type":"Polygon", ... ,6563498.44078949]]]}}' (the dots are just the rest of your original json.
How to separate key-values per row from a JSON formatted list?
I've been trying to get a more readable output from a JSON list. I have not yet been successful. I hard-coded some data to see if I can get it as I want. This is what I did: import json jsonData = { "person": {"FirstName": "Kwin", "LastName": "Harley", "Age": 25}, "DoB": {"DateOfBirth": "19/12/1996", "Birthplace": "Belgium"}, "insurer":{"id":"12345","contractNumber":"98765432", "valid_from":"2020-10-01T00:00:00.000Z","valid_until":"2021-01-30T00:00:00.000Z", "representativeID":"135792468", "representativeEmail":"sample#test.com"} } jsonString = json.dumps(jsonData, sort_keys=False, indent=4) print(jsonString) Output 1 As you can see, the data is structured nicely. Now, when I use my main code, the output looks like this: Output 2 It just returns the data in 1 row :( Is there a way to fix that? This is the code I have for that: qrType = qr.type qrData = json.dumps(qr.data.decode('utf-8'),sort_keys=True) # print the QR type and data to the terminal print("[INFORMATION] Found {} barcode:\n{}".format(qrType, qrData))
I don't think you're passing a dict to json.dumps() at all. qr.data is clearly a string, as you .decode() it. Presumably it's a json string, so you want to do something like this: formatted_data = json.dumps(json.load(qr.data.decode()), indent=2) print(formatted_data)
Python JSON encoding invalid json format
i've stucked, i have a json with symbols like ' in values and syntax with ' and " Example mix double qoute and single qoutelink json ={ 'key': "val_'_ue", 'secondkey': 'value' } With json loads and json dumps i got a str type not a dict to iterate, any ideas how i get it fixed? print(postParams)# = {'csrf-token': "TOKEN_INCLUDES_'_'_symbols", 'param2': 'params2value'} jsn_dict2 = json.loads(json.dumps(postParams)) print(type(jsn_dict2)) # ERROR HERE why str and not dict for key, val in jsn_dict2.items(): print("key="+str(key))
you dont need to dumps() an already string json data: jsn_dict = json.loads(json.dumps(res)) should be : jsn_dict = json.loads(res) UPDATE according to comments the data is looks like so: postParams = "{'csrf-token': \"TOKEN_INCLUDES_'_'_symbols\", 'add-to-your-blog-submit-button': 'add-to-your-blog-submit-button'}" so i found an library that can help damaged json string like this one: first run : pip install demjson then this code can help you: from demjson import decode data = decode(postParams) data >>> {'csrf-token': "TOKEN_INCLUDES_'_'_symbols", 'add-to-your-blog-submit-button': 'add-to-your-blog-submit-button'}
In your json u have missed the "," comma separation between two keys. The actual structure of the JSON is json_new ={ 'key': "val_'_ue", 'secondkey': 'value' } use json_actual=json.dumps(json_new) to read, json_read=json.loads(json_actual)
Convert a string with the name of a variable to a dictionary
I have a string which is little complex in that, it has some objects embedded as values. I need to convert them to proper dict or json. foo = '{"Source": "my source", "Input": {"User_id": 18, "some_object": this_is_a_variable_actually}}' Notice that the last key some_object has a value which is neither a string nor an int. Hence when I do a json.loads or ast.literal_eval, I am getting malformed string errors, and so Converting a String to Dictionary doesn't work. I have no control over the source of the string. Is it possible to convert such strings to dictionary The result I need is a dict like this dict = { "Source" : "Good", "object1": variable1, "object2": variable2 } The thing here is I wouldn't know what is variable1 or 2. There is no pattern here. One point I want to mention here is that, If I can make the variables as just plain strings, that is also fine For example, dict = { "Source" : "Good", "object1": "variable1", "object2": "variable2" } This will be good for my purpose. Thanks for all the answers.
It's a bit of a kludge using the demjson module which allows you to parse most of a somewhat non-confirming JSON syntax string and lists the errors... You can then use that to replace the invalid tokens found and put quotes around it just so it parses correctly, eg: import demjson import re foo = '{"Source": "my source", "Input": {"User_id": 18, "some_object": this_is_a_variable_actually}}' def f(json_str): res = demjson.decode(json_str, strict=False, return_errors=True) if not res.errors: return res for err in res.errors: var = err.args[1] json_str = re.sub(r'\b{}\b'.format(var), '"{}"'.format(var), json_str) return demjson.decode(json_str, strict=False) res = f(foo) Gives you: {'Input': {'User_id': 18, 'some_object': 'this_is_a_variable_actually'}, 'Source': 'my source'} Note that while this should work in the example data presented, your mileage may vary if there's other nuisances in your input that require further munging.
Python how to read orderedDict from a txt file
Basically I want to read a string from a text file and store it as orderedDict. My file contains the following content. content.txt: variable_one=OrderedDict([('xxx', [['xxx_a', 'xxx_b'],['xx_c', 'xx_d']]),('yyy', [['yyy_a', 'yyy_b'],['yy_c', 'yy_d']]))]) variable_two=OrderedDict([('xxx', [['xxx_a', 'xxx_b'],['xx_c', 'xx_d']]),('yyy', [['yyy_a', 'yyy_b'],['yy_c', 'yy_d']]))]) how will I retrieve values in python as: xxx xxx_a -> xxx_b xxx_c -> xxx_d
import re from ast import literal_eval from collections import OrderedDict # This string is slightly different from your sample which had an extra bracket line = "variable_one=OrderedDict([('xxx', [['xxx_a', 'xxx_b'],['xx_c', 'xx_d']]),('yyy', [['yyy_a', 'yyy_b'],['yy_c', 'yy_d']])])" match = re.match(r'(\w+)\s*=\s*OrderedDict\((.+)\)\s*$', line) variable, data = match.groups() # This allows safe evaluation: data can only be a basic data structure data = literal_eval(data) data = [(key, OrderedDict(val)) for key, val in data] data = OrderedDict(data) Verification that it works: print variable import json print json.dumps(data, indent=4) Output: variable_one { "xxx": { "xxx_a": "xxx_b", "xx_c": "xx_d" }, "yyy": { "yyy_a": "yyy_b", "yy_c": "yy_d" } } Having said all that, your request is very odd. If you can control the source of the data, use a real serialisation format that supports order (so not JSON). Don't output Python code.