简体   繁体   中英

How to Convert a data set from a database query to a specific JSON format for input to a REST api

I am fairly new to python and would like some assistance with a problem.

I have a SQL select query that returns a column with values. I would like to pass the records in a header request to a REST API call. The issue is that the API call expects the data in a specific JSON format.

How can I convert the data returned by the query to the specific JSON format shown below?

Query from SQL returns:

InfoId
------
1
2
3
4
5
6

I need to pass these values to a REST API as JSON in the following format:

{
     "InfoId":[
         1,2,3,4,5,6
      ]
}

I have tried couple of options to solve this problem.

I have tried converting the data into json using the pandas datatable.to_json method with the various orient parameters but none of them return the desired format as shown above.

import requests
import json
import pyodbc
import pandas as pd

conn = pyodbc.connect('Driver={SQL SERVER};'
                      'Server=myServer;'
                      'Database=TestDb;'
                      'Trusted_Connection=yes;'
                      )

cursor = conn.cursor()

sql_query = pd.read_sql_query('SELECT InfoId FROM tbl_info', conn)
#print(sql_query)

print(sql_query.to_json(orient='values', index=False))

url = "http://ldapiserver:5000/patterns/v1/swirl?idType=Info"

#sample payload
#payload = "{\r\n  \"InfoId\": [\r\n    1,2,3,4,5,6\r\n  ]\r\n}"

payload = sql_query.to_json(orient='records')


headers = {
  'Content-Type': 'application/json'
}

response = requests.request("POST", url, headers=headers, data=json.dumps(payload, indent=4))
resp_body = response.json()
print(resp_body)
print(response.elapsed.total_seconds())

The 2nd method I have tried is to convert the rows from SQL query into an list object and then form the json string. It works that way but I would like to automate is so that irrespective of the query it can for the json string.

import requests
import json
import pyodbc

conn = pyodbc.connect('Driver={SQL SERVER};'
                      'Server=myServer;'
                      'Database=TestDb;'
                      'Trusted_Connection=yes;'
                      )

cursor = conn.cursor()
cursor.execute("""
            SELECT InfoId FROM tbl_info
            """)
rows = cursor.fetchall()

# Convert query to row arrays
rowarray_list = []
for row in rows:
    t = (row.InfoId)
    rowarray_list.append(t)
j = json.dumps(rowarray_list)

conn.close()

txt = '{"InfoId": ', j, '}'
# print(txt)

payload = txt[0]+txt[1]+txt[2]

url = "http://ldapiserver:5000/patterns/v1/swirl?idType=Info"

# payload = "{\r\n  \"InfoId\": [\r\n    72,74\r\n  ]\r\n}"

#print(json .dumps(payload, indent=4))
headers = {
  'Content-Type': 'application/json'
}

response = requests.request("POST", url, headers=headers, data=payload)

resp_body = response.json()

print(resp_body)
print(response.elapsed.total_seconds())

Appreciate any help with this.

Thank you.

To convert your SQL query to JSON,

.
.
.
rows = cursor.fetchall()        
# convert to list
json_rows = [dict(zip([key[0] for key in cursor.description], row)) for row in rows]

Then you can return your response as you like

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM