2016-01-12 4 views
-2

У меня есть вопрос Ruby on Rails JSON.Преобразование строки JSON в хэш

У меня есть то, что я считаю странной ошибкой. У меня есть следующие JSON строку, я получаю как это от внешнего API

test = "[{'domain': 'abc.com'}, {'domain': 'def.com'}, {'domain': 'ghi.com'}]" 

Теперь я хочу, чтобы преобразовать эту строку в хэш с помощью:

hash = JSON.parse test 

Проблема заключается в том, что это ошибки с:

JSON::ParserError: 419: unexpected token at '{'domain': 'abc.com'}, {'domain': 'def.com'}, {'domain': 'ghi.com'}]' 

Проблема теперь только с заменой «на» опасна, если какие-либо строки содержат «или». У кого-нибудь есть решение?

+0

Вы можете сделать JSON.parse test.gsub ("'",' '') '. Это приведет к удалению всех одинарных кавычек, а затем проанализирует строку – Santhosh

+0

. Я получаю этот JSON от внешнего API, поэтому ваше решение возможно, лучший способ. Спасибо! – JayC

+0

Однако может возникнуть проблема, если в значениях json есть '' 'или '' ', заменив все' '' на '' ', может сломать json .... кто-нибудь есть решение? – JayC

ответ

5

Это скорее всего, потому что это недействительно JSON. Меняйте одиночные кавычки в двойные кавычки, например:

test = '[{"domain": "abc.com"}, {"domain": "def.com"}, {"domain": "ghi.com"}]' 

Объяснение можно найти here, и вы можете проверить свою JSON here.

+0

Проблема в том, что я получаю ее так, как из внешнего API. Есть ли безопасный способ« конвертировать »ее в реальный JSON? Просто замена '' 'является опасной. – JayC

+0

Вы правы в том, что« просто заменяете «' »« опасным. К сожалению, нет отличного способа сделать это. Я настоятельно рекомендую отправить по электронной почте поставщика API (или подачи вопроса, если они какая-то такая система настроена) и сообщая им, что их API несовместим со всеми строгими анализаторами JSON (которые, вероятно, будут включать Ruby, Java, Python, PHP, .NET - практически обо всем, кроме вызова 'eval' в среде выполнения JavaScript, риск, который не хочет принимать здравомыслящий разработчик). –

+0

Я решил (уродливое исправление, которое должно быть довольно безопасным) с помощью 'JSON.parse test.gsub (" {'",' {" ') .gsub ("': '",' ":" '). Gsub ("':' ','": "'). gsub ("': '",'": "'). gsub ("': '",'": "'). gsub ("'} ", '"}'). gsub (" ': ",'": '). gsub (",'", ', "'). gsub (", '",'," '). gsub ("', "," ","). gsub ("',",' ", '). gsub (" u' ", '"') .gsub ("']",' "] '). gsub (" [ '', '[' ') ' – JayC

0

Используйте этот код. вам не хватает ActiveSupport :: JSON

ActiveSupport::JSON.decode json_string 
+1

Пробовал: 'hash = ActiveSupport :: JSON.decode test'. Такая же ошибка, извините. – JayC

2

Вы получаете сообщение об ошибке, поскольку ваша строка недопустима JSON. В JSON все имена свойств должны быть двойными, а строковые значения также должны быть двойными кавычками. Одиночные кавычки никогда не действительны.

test = '[{"domain": "abc.com"}, {"domain": "def.com"}, {"domain": "ghi.com"}]' 
JSON.parse(test) 
# => [ { "domain" => "abc.com" }, 
#  { "domain" => "def.com" }, 
#  { "domain" => "ghi.com" } ] 
Смежные вопросы