Bottom Page

Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
 Object of type set is not JSON serializable
#1
Hi

I've a new problem with json / python.

My json is:
Output:
{ "domaine": { "name": { "service": ["service1", "service2"], "threshold": ["100", "200"] }, ...
On my python script, I'm trying to make a request post to my icinga configuration for monitoring.

#!/usr/bin/env python3
..
with open('/tmp/config.json') as json_file1:
            data1 = json.load(json_file1)
            for domaine, value in data1.items():
                    for name, value2 in value.items():
                            service = data1[domaine][name]['service']
                            threshold = data1[domaine][name]['threshold']

                            try:
                                url = "https://localhost:5665/v1/objects/hosts/"
                                request_url = url+hostname
                                headers = {
                                    'Accept': 'application/json',
                                    'X-HTTP-Method-Override': 'PUT'
                                }
                                data = {
                                    "templates": service,
                                    "attrs": {
                                                "address":"BLABLA",
                                                "zone":"BLIBLI",
                                                "vars": { threshold }
                                    }
                                }
                                r = requests.post(request_url,
                                    headers=headers,
                                    verify=False,
                                    auth=('admin', 'XXXXXXXXXXXXXXXXXX'),
                                data=json.dumps(data))

Result is:
Output:
"vars": { threshold } TypeError: unhashable type: 'list'
If I change
Output:
threshold = data1[domaine][name]['threshold'] to: threshold = tuple(data1[domaine][name]['threshold'])
My result is:
Output:
TypeError: Object of type set is not JSON serializable
I'm trying to change key, format, ... but i'm blocked with this point...

Thanks for help
Quote
#2
{ threshold } is a set with one element. if you pass list to set - it doesn't work because list is mutable, thus not hashable and cannot be element in a set. If you change it to tuple, the set works, but it's not seriazable, as the second error says (i.e. there is no respective type in json).
why you would like a set? what is required as per specifications? I think you misread your specs.

As a side note - fix your indentation and also, don't use spaces after/before braces/brackets i.e. {threshold}
Quote
#3
I'm not sure about me for this point ...

In fact if I do my request with curl it works:
Output:
curl -vv -k -X PUT -u "admin:${PASSWORD_API_ADMIN}" -H 'Accept: application/json' -H 'Content-Type: application/json' -L "https://localhost:5665/v1/objects/hosts/hostname", -d "{\"templates\": [\"service1\",\"service2\"], \"attrs\": { \"address\": \"BLABLA\", \"zone\": \"BLIBLI\", \"vars\": {\"threshold1\":100, \"threshlod2\":200} } }"| python3.7 -m json.tool
So perhaps my json format is not good?
I'm a little lost with this json format

Output:
{ "domaine": { "name": { "service": ["service1", "service2"], "threshold": ["threshold1: 100", "threshold2: 200"] }, ...

Seems good.

I've changed my json config with:
Output:
"threshold": {"threshold1": "100", "threshold2": "200"}
and my python code sith:
Output:
"vars": threshold
and it works now
Quote
#4
in curls you have a dict, not set
so
#!/usr/bin/env python3
..
with open('/tmp/config.json') as json_file1:
    data1 = json.load(json_file1)
    for domaine, value in data1.items():
        for name, value2 in value.items():
            service = data1[domaine][name]['service']
            threshold1, threshold2 = data1[domaine][name]['threshold'] # unpack the list
            try:
                url = "https://localhost:5665/v1/objects/hosts/"
                request_url = url+hostname
                headers = {
                    'Accept': 'application/json',
                    'X-HTTP-Method-Override': 'PUT'
                }
                data = {
                    "templates": service,
                    "attrs": {
                                "address":"BLABLA",
                                "zone":"BLIBLI",
                                "vars": {'threshold1':threshold1, 'threshold2':threshold2}
                    }
                }
                r = requests.post(request_url,
                    headers=headers,
                    verify=False,
                    auth=('admin', 'XXXXXXXXXXXXXXXXXX'),
                        data=json.dumps(data))
note that in curl threshold1 and threshold2 are integers, you will read them as str, so you may need to explicitly convert them
Quote
#5
yeah, that's also possibility, if you can change the input json
Quote
#6
Tanks for help! Have a good day!
Quote

Top Page

Possibly Related Threads...
Thread Author Replies Views Last Post
  AttributeError: type object 'FunctionNode' has no attribute '_TestValidateFuncLabel__ binhduonggttn 0 36 Today, 11:29 AM
Last Post: binhduonggttn
  Type hinting - return type based on parameter micseydel 2 119 Jan-14-2020, 01:20 AM
Last Post: micseydel
  type of object as a string Skaperen 1 163 Dec-02-2019, 08:01 AM
Last Post: midarq
  Object of type Scoreboard is not JSON serializable lsepolis123 9 2,811 Aug-13-2019, 11:22 AM
Last Post: lsepolis123
  Object and type class Uchikago 2 257 Jul-28-2019, 10:35 AM
Last Post: DeaD_EyE
  Object type of Node to json bhojendra 4 694 Apr-28-2019, 01:36 PM
Last Post: bhojendra
  TypeError: object of type 'NoneType' has no len() - what do it mean? leviathan54 4 2,606 Apr-20-2019, 12:04 PM
Last Post: leviathan54
  Getting error "Type error-a bytes-like object..." mrapple2020 1 2,045 Apr-06-2019, 06:37 PM
Last Post: mrapple2020
  Variant type object arrays anbra 3 1,339 Jul-29-2018, 09:25 PM
Last Post: anbra
  Object of type 'Status' is not JSON serializable ndakena 1 1,860 May-28-2018, 06:35 AM
Last Post: buran

Forum Jump:


Users browsing this thread: 1 Guest(s)