Browse Source

Adding more encodings to JSON parsing in labkeyDatabaseBrowser

Andrej 1 year ago
parent
commit
4b28c9d194
1 changed files with 15 additions and 6 deletions
  1. 15 6
      labkeyDatabaseBrowser.py

+ 15 - 6
labkeyDatabaseBrowser.py

@@ -21,8 +21,7 @@ class labkeyDB:
       if debug:
          print("Sending {}").format(url)
       response=self.net.get(url)
-      encoding=chardet.detect(response.data)["encoding"]
-      return json.loads(response.data.decode(encoding))
+      return self.toJSON(response)
 
    def modifyRows(self,mode, project,schemaName, queryName, rows):
       #mode can be insert/update/delete
@@ -34,7 +33,7 @@ class labkeyDB:
       url=self.net.GetLabkeyUrl()+'/'+project
       url+='/query-'+mode+'Rows.api?'
       response=self.net.post(url,json.dumps(data))
-      return response.data
+      return self.toJSON(response)
 
    def addQuery(self,project,schemaName,queryName,fields,options=None):
       
@@ -68,8 +67,7 @@ class labkeyDB:
       url=self.net.GetLabkeyUrl()+'/'+project
       url+='/property-createDomain.api'
       response=self.net.post(url,json.dumps(listDomainDefinition))
-      encoding=chardet.detect(response.data)["encoding"]
-      return json.loads(response.data.decode(encoding))
+      return self.toJSON(response)
 
    def getQueryDesign(self,project,schemaName,queryName):
       url=self.net.GetLabkeyUrl()+'/'+project
@@ -77,8 +75,19 @@ class labkeyDB:
       url+='schemaName={}'.format(schemaName)
       url+='&queryName={}'.format(queryName)
       response=self.net.get(url)
+      return self.toJSON(response)
+
+   def toJSON(self,response):
       encoding=chardet.detect(response.data)["encoding"]
-      return json.loads(response.data.decode(encoding))
+      #try with a set of encodings to maximize probability of success
+      encodings=[encoding,'utf_8']
+      for x in encodings:
+      try:
+         return json.loads(response.data.decode(x))
+      except UnicodeDecodeError:
+         print(f'Failed to decode with [{x}]: {data}')
+      return None
+