Ccna final exam - java, php, javascript, ios, cshap all in one. This is a collaboratively edited question and answer site for professional and enthusiast programmers. It's 100% free, no registration required.
Friday, February 17, 2012
Convert "{key1=value1, key2=value2}" format into an object
I have some strings having a format like this:
'{key1=value1, key2=value2}'
What's the best way to convert a string with this format into a JavaScript object?
In that format nothing built in will help you. That's not quite a valid object literal, so eval will fail (eval should be avoided anyway), and it's not quite a JSON string, so JSON.parse will fail too. Can you massage the format? If you could get it to be {"key1": value1, "key2": value2 }, then both of the things I mentioned would work out of the box. JSON.parse in particular would be good:
var resultingObject = JSON.parse('{"key1": value1, "key2": value2 }')
It will (probably) be easier to massage the data into a valid JSON format than try and write your own parser. But if you have no choice on the format, a parser is probably your only option.
In desperation, a crude function to convert the format to JSON through brute force (replace all '=' with ':', wrap the keys in quotes, probably via a regex) would work, but it'd be brittle.
If the values are numbers, not strings, and the info came from a trusted source, then you could simply eval the string.
If the values can contain strings then you'll need to parse it.
Added: oops, I forgot that the key/value separator is a colon, not an equals. @sinsedrix solution is good, except that you need to eval it since it still isn't valid JSON. (JSON requires that the keys be strings, not bare-words.)
It's almost JSON you could parse:
ReplyDeleteJSON.parse('{key1=value1, key2=value2}'.replace(/=/g,":"))
EDIT With keys as strings (thx @MattGreer):
JSON.parse('{key1=value1, key2=value2}'.replace(/(\w+)=/g, '"$1":'))
EDIT With values as strings (thx @ajsie):
JSON.parse('{key1=value1, key2=value2}'.replace(/(\w+)=(\w+)/g, '"$1":"$2"'))
This could work. Not tested though.
ReplyDeletevar data = '{key1=value1, key2=value2}',
values = data.match(/\w+=\w+/g),
newObject = {},
i, value;
for (i=0; i < values.length; i++) {
value = values[i].split('=');
newObject[value[0]] = value[1] ;
};
In that format nothing built in will help you. That's not quite a valid object literal, so eval will fail (eval should be avoided anyway), and it's not quite a JSON string, so JSON.parse will fail too. Can you massage the format? If you could get it to be {"key1": value1, "key2": value2 }, then both of the things I mentioned would work out of the box. JSON.parse in particular would be good:
ReplyDeletevar resultingObject = JSON.parse('{"key1": value1, "key2": value2 }')
It will (probably) be easier to massage the data into a valid JSON format than try and write your own parser. But if you have no choice on the format, a parser is probably your only option.
In desperation, a crude function to convert the format to JSON through brute force (replace all '=' with ':', wrap the keys in quotes, probably via a regex) would work, but it'd be brittle.
If the values are numbers, not strings, and the info came from a trusted source, then you could simply eval the string.
ReplyDeleteIf the values can contain strings then you'll need to parse it.
Added: oops, I forgot that the key/value separator is a colon, not an equals. @sinsedrix solution is good, except that you need to eval it since it still isn't valid JSON. (JSON requires that the keys be strings, not bare-words.)