Constructing JSON data structures from non-string key python dictionaries

S

saikari78

Hi,

I'm using the json module to create a JSON string, then inserting that string into a html template containing a javascript function (from the highcharts library: http://www.highcharts.com/)
The json string I'm trying to create is to initialize a data variable in the javascript function, that has the following example format.



data = [{
y: 55.11,
color: colors[0],
drilldown: {
name: 'MSIE versions',
categories: ['MSIE 6.0', 'MSIE 7.0', 'MSIE 8.0', 'MSIE 9.0'],
data: [10.85, 7.35, 33.06, 2.81],
color: colors[0]
}
}]

However, I don't know how to do that because dictionary keys in python need to be strings. If I try to do the following, Python,of course, complains that y,color,drilldown, etc are not defined.


import json

data = [ { y:55.11, color:colors[0], drilldown:{name: 'MSIE versions',categories: ['MSIE 6.0', 'MSIE 7.0', 'MSIE 8.0', 'MSIE 9.0'],data: [10.85, 7.35, 33.06, 2.81],color: colors[0] }} ]

data_string = json.dumps(data)


Many thanks for any suggestions on how to do this.
 
M

MRAB

Hi,

I'm using the json module to create a JSON string, then inserting that string into a html template containing a javascript function (from the highcharts library: http://www.highcharts.com/)
The json string I'm trying to create is to initialize a data variable in the javascript function, that has the following example format.



data = [{
y: 55.11,
color: colors[0],
drilldown: {
name: 'MSIE versions',
categories: ['MSIE 6.0', 'MSIE 7.0', 'MSIE 8.0', 'MSIE 9.0'],
data: [10.85, 7.35, 33.06, 2.81],
color: colors[0]
}
}]

However, I don't know how to do that because dictionary keys in python need to be strings. If I try to do the following, Python,of course, complains that y,color,drilldown, etc are not defined.


import json

data = [ { y:55.11, color:colors[0], drilldown:{name: 'MSIE versions',categories: ['MSIE 6.0', 'MSIE 7.0', 'MSIE 8.0', 'MSIE 9.0'],data: [10.85, 7.35, 33.06, 2.81],color: colors[0] }} ]

data_string = json.dumps(data)


Many thanks for any suggestions on how to do this.
Just quote them:

data = [ { 'y':55.11, 'color':colors[0], 'drilldown':{'name': 'MSIE
versions','categories': ['MSIE 6.0', 'MSIE 7.0', 'MSIE 8.0', 'MSIE
9.0'],'data': [10.85, 7.35, 33.06, 2.81],'color': colors[0] }} ]

Incidentally, dictionary keys in Python don't have to be strings, but
merely 'hashable', which includes integers, floats and tuples amongst
others.
 
G

Grant Edwards

However, I don't know how to do that because dictionary keys in
python need to be strings. If I try to do the following, Python,of
course, complains that y,color,drilldown, etc are not defined.

Just quote them:

data = [ { 'y':55.11, 'color':colors[0], 'drilldown':{'name': 'MSIE
versions','categories': ['MSIE 6.0', 'MSIE 7.0', 'MSIE 8.0', 'MSIE
9.0'],'data': [10.85, 7.35, 33.06, 2.81],'color': colors[0] }} ]

Incidentally, dictionary keys in Python don't have to be strings, but
merely 'hashable', which includes integers, floats and tuples amongst
others.

I think he meant that in his use case, the Python dictionary keys must
be strings, since that's what JSON requires.
 
H

hfolch

Thanks for your reply, but the javascript function expects option names to be unquoted, otherwise it won't work.



Hi,

I'm using the json module to create a JSON string, then inserting that string into a html template containing a javascript function (from the highcharts library: http://www.highcharts.com/)
The json string I'm trying to create is to initialize a data variable in the javascript function, that has the following example format.
data = [{
y: 55.11,
color: colors[0],
drilldown: {
name: 'MSIE versions',
categories: ['MSIE 6.0', 'MSIE 7.0', 'MSIE 8.0', 'MSIE 9.0'],
data: [10.85, 7.35, 33.06, 2.81],
color: colors[0]

However, I don't know how to do that because dictionary keys in python need to be strings. If I try to do the following, Python,of course, complains that y,color,drilldown, etc are not defined.
import json
data = [ { y:55.11, color:colors[0], drilldown:{name: 'MSIE versions',categories: ['MSIE 6.0', 'MSIE 7.0', 'MSIE 8.0', 'MSIE 9.0'],data: [10.85, 7.35, 33.06, 2.81],color: colors[0] }} ]
data_string = json.dumps(data)
Many thanks for any suggestions on how to do this.

Just quote them:



data = [ { 'y':55.11, 'color':colors[0], 'drilldown':{'name': 'MSIE

versions','categories': ['MSIE 6.0', 'MSIE 7.0', 'MSIE 8.0', 'MSIE

9.0'],'data': [10.85, 7.35, 33.06, 2.81],'color': colors[0] }} ]



Incidentally, dictionary keys in Python don't have to be strings, but

merely 'hashable', which includes integers, floats and tuples amongst

others.
 
H

hfolch

Thanks for your reply, but the javascript function expects option names to be unquoted, otherwise it won't work.



Hi,

I'm using the json module to create a JSON string, then inserting that string into a html template containing a javascript function (from the highcharts library: http://www.highcharts.com/)
The json string I'm trying to create is to initialize a data variable in the javascript function, that has the following example format.
data = [{
y: 55.11,
color: colors[0],
drilldown: {
name: 'MSIE versions',
categories: ['MSIE 6.0', 'MSIE 7.0', 'MSIE 8.0', 'MSIE 9.0'],
data: [10.85, 7.35, 33.06, 2.81],
color: colors[0]

However, I don't know how to do that because dictionary keys in python need to be strings. If I try to do the following, Python,of course, complains that y,color,drilldown, etc are not defined.
import json
data = [ { y:55.11, color:colors[0], drilldown:{name: 'MSIE versions',categories: ['MSIE 6.0', 'MSIE 7.0', 'MSIE 8.0', 'MSIE 9.0'],data: [10.85, 7.35, 33.06, 2.81],color: colors[0] }} ]
data_string = json.dumps(data)
Many thanks for any suggestions on how to do this.

Just quote them:



data = [ { 'y':55.11, 'color':colors[0], 'drilldown':{'name': 'MSIE

versions','categories': ['MSIE 6.0', 'MSIE 7.0', 'MSIE 8.0', 'MSIE

9.0'],'data': [10.85, 7.35, 33.06, 2.81],'color': colors[0] }} ]



Incidentally, dictionary keys in Python don't have to be strings, but

merely 'hashable', which includes integers, floats and tuples amongst

others.
 
M

MRAB

Hi,

I'm using the json module to create a JSON string, then
inserting that string into a html template containing a javascript
function (from the highcharts library: http://www.highcharts.com/)

The json string I'm trying to create is to initialize a data
variable in the javascript function, that has the following example
format.

data = [{ y: 55.11, color: colors[0], drilldown: { name: 'MSIE
versions', categories: ['MSIE 6.0', 'MSIE 7.0', 'MSIE 8.0', 'MSIE 9.0'],
data: [10.85, 7.35, 33.06, 2.81], color: colors[0] } }]

However, I don't know how to do that because dictionary keys in
python need to be strings. If I try to do the following, Python,of
course, complains that y,color,drilldown, etc are not defined.


import json

data = [ { y:55.11, color:colors[0], drilldown:{name: 'MSIE
versions',categories: ['MSIE 6.0', 'MSIE 7.0', 'MSIE 8.0', 'MSIE
9.0'],data: [10.85, 7.35, 33.06, 2.81],color: colors[0] }} ]
data_string = json.dumps(data)


Many thanks for any suggestions on how to do this.
Just quote them: data = [ { 'y':55.11, 'color':colors[0],
'drilldown':{'name': 'MSIE versions','categories': ['MSIE 6.0',
'MSIE 7.0', 'MSIE 8.0', 'MSIE 9.0'],'data': [10.85, 7.35, 33.06,
2.81],'color': colors[0] }} ] Incidentally, dictionary keys in
Python don't have to be strings, but merely 'hashable', which
includes integers, floats and tuples amongst others.

Thanks for your reply, but the javascript function expects option
names to be unquoted, otherwise it won't work.

Both Python source code and JSON require the dictionary keys to be
quoted, so using the json module to generate JavaScript code isn't
going to give you what you want.

It shouldn't be too difficult to write a simple function to do it,
considering the limited range of types.
 
M

MRAB

On 2012-11-21 14:59, saikari78 wrote:
Hi,

I'm using the json module to create a JSON string, then
inserting that string into a html template containing a javascript
function (from the highcharts library: http://www.highcharts.com/)

The json string I'm trying to create is to initialize a data
variable in the javascript function, that has the following example
format.

data = [{ y: 55.11, color: colors[0], drilldown: { name: 'MSIE
versions', categories: ['MSIE 6.0', 'MSIE 7.0', 'MSIE 8.0', 'MSIE
9.0'], data: [10.85, 7.35, 33.06, 2.81], color: colors[0] } }]

However, I don't know how to do that because dictionary keys in
python need to be strings. If I try to do the following, Python,of
course, complains that y,color,drilldown, etc are not defined.


import json

data = [ { y:55.11, color:colors[0], drilldown:{name: 'MSIE
versions',categories: ['MSIE 6.0', 'MSIE 7.0', 'MSIE 8.0', 'MSIE
9.0'],data: [10.85, 7.35, 33.06, 2.81],color: colors[0] }} ]

data_string = json.dumps(data)


Many thanks for any suggestions on how to do this.

Just quote them:
data = [ { 'y':55.11, 'color':colors[0], 'drilldown':{'name': 'MSIE
versions', 'categories': ['MSIE 6.0', 'MSIE 7.0', 'MSIE 8.0', 'MSIE
9.0'],'data': [10.85, 7.35, 33.06, 2.81],'color': colors[0] }} ]

Incidentally, dictionary keys in Python don't have to be strings,
but merely 'hashable', which includes integers, floats and tuples
amongst others.

Thanks for your reply, but the javascript function expects option
names to be unquoted, otherwise it won't work.

Both Python source code and JSON require the dictionary keys to be
quoted, so using the json module to generate JavaScript code isn't
going to give you what you want.

It shouldn't be too difficult to write a simple function to do it,
considering the limited range of types.
Here's such a function:

def dump_javascript(data):
if isinstance(data, dict):
items = []

for key, value in data.items():
items.append(key + ": " + dump_javascript(value))

return "{" + ", ".join(items) + "}"
elif isinstance(data, list):
items = []

for value in data:
items.append(dump_javascript(value))

return "[" + ", ".join(items) + "]"
else:
return json.dumps(data)
 
C

Chris Rebert

Nontrivial templating of JavaScript is generally a bad/inelegant
approach. I would instead suggest generating the JSON separately and
loading it from JavaScript via $.getJSON or similar. Or sticking the
JSON into a hidden part of the webpage and then using JSON.parse().
The json string I'm trying to create is to initialize a data variable in
the javascript function, that has the following example format.

data = [{
y: 55.11,
color: colors[0],
drilldown: {
name: 'MSIE versions',
categories: ['MSIE 6.0', 'MSIE 7.0', 'MSIE 8.0',
'MSIE 9.0'],
data: [10.85, 7.35, 33.06, 2.81],
color: colors[0]
}
}]

However, I don't know how to do that because dictionary keys in python
need to be strings. If I try to do the following, Python,of course,
complains that y,color,drilldown, etc are not defined.


import json

data = [ { y:55.11, color:colors[0], drilldown:{name: 'MSIE
versions',categories: ['MSIE 6.0', 'MSIE 7.0', 'MSIE 8.0', 'MSIE 9.0'],data:
[10.85, 7.35, 33.06, 2.81],color: colors[0] }} ]

data_string = json.dumps(data)


Many thanks for any suggestions on how to do this.
Just quote them:


data = [ { 'y':55.11, 'color':colors[0], 'drilldown':{'name': 'MSIE
versions','categories': ['MSIE 6.0', 'MSIE 7.0', 'MSIE 8.0', 'MSIE
9.0'],'data': [10.85, 7.35, 33.06, 2.81],'color': colors[0] }} ]

Incidentally, dictionary keys in Python don't have to be strings, but
merely 'hashable', which includes integers, floats and tuples amongst
others.

Thanks for your reply, but the javascript function expects option names to be unquoted, otherwise it won't work.

As a user of HighCharts (and thus, unfortunately, JavaScript), I can
tell you that that's absolutely incorrect.
In JavaScript, {x : y}, {"x" : y}, and {'x' : y} are all equivalent
(at least when x is a valid JavaScript identifier; consult some
non-w3schools JavaScript docs).
Plus, you say you're using JSON; JSON *explicitly mandates that the
keys be quoted* (see RFC 4627).

You are experiencing Python NameErrors because {"x" : y} and {x : y}
aren't equivalent in Python. Python doesn't limit dicts keys to
strings, so `x` is a variable in the latter snippet; x's value is used
as the key.
You cannot expect to take arbitrary, unmodified JavaScript
code/literals, copy-paste them into Python, and expect them to work.


TL;DR:
# foo.py
from json import dumps

colors = SOME_LIST

data = [dict( # use dict() to avoid tedious quoting
y=55.11,
color=colors[0],
drilldown=dict(
name='MSIE versions',
categories=['MSIE 6.0', 'MSIE 7.0', 'MSIE 8.0', 'MSIE 9.0'],
data=[10.85, 7.35, 33.06, 2.81],
color=colors[0],
)
)]

your_json = dumps(data)
# ...serve the JSON somehow...
================
// bar.js
// Not industrial-strength. Assumes the use of jQuery.
// ...
$.getJSON(SOME_URL, function (data) {
// use 'data', which will be a JavaScript object by this point
});
// ...


Regards,
Chris
 
P

Paul Kölle

Am 21.11.2012 17:04, schrieb (e-mail address removed):
Thanks for your reply, but the javascript function expects option
names to be unquoted, otherwise it won't work.
Others have shown you how to solve this, but I would like to note that
the function does NOT expect JSON but a simple javascript object literal.

cheers
Paul
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,020
Latest member
GenesisGai

Latest Threads

Top