2017-01-04 2 views
1

Сейчас у меня есть АЯКС вызов, который возвращает мне это:Javascript/JQuery удалить кавычки из особенностей JSON значений

"nodes": 
     [ 
      {"ID":"87","score":"-0.2","dscore":"-0.4","x":"250","y":"250","name":"TEST","ticker":"TEST","datafrom":"0000-00-00","r":"28","fixed":"true","color":"grey"} 
] 

Когда мне это нужно

"nodes": 
     [ 
      {"ID":"87","score":"-0.2","dscore":"-0.4","x":250,"y":250,"name":"TEST","ticker":"TEST","datafrom":"0000-00-00","r":"28","fixed":"true","color":"grey"} 
] 

Таким образом, реальная разница между "x" и "y" значения, первый пример: у них двойные кавычки, во вторых - нет. Я использую это для d3.js, поэтому он должен быть без кавычек, и я тяну много, это была только одна строка. Поэтому я могу разобрать это через php/ajax/javascript, что бы ни было наиболее эффективным. Как бы я продолжал разбирать все это?

Редактировать: Я сказал php, поскольку я использую php, чтобы захватить эту информацию из базы данных, после чего я делаю json_encode($str), так что она тоже паразита.

ответ

1

Проблема заключается в том, что когда исходные данные кодируются json, все поля в массиве nodes имеют тип «string», поэтому json encoder кодирует их как строки с кавычками.

Наиболее правильным способом исправить это будет присвоение правильных типов исходным данным, поэтому json encoder будет кодировать его как числа с кавычками.

Если у вас есть какой-либо контроль на стороне, которая генерирует JSON вы получаете в ответ, то просто intval/floatval эти цифры перед вами JSON-кодировать их.

Если у вас его нет, то конвертируйте его на стороне js, прежде чем перейти к d3. Используйте parseInt(nodes[i].x, 10) или parseFloat(nodes[i].y, 10), в зависимости от типа значений x и y. При преобразовании строк в числа в JS всегда важно указать второй параметр «radix», или ваши цифры могут быть интерпретированы некоторыми двигателями JS как восьмеричные, если они начинаются с 0. См. MDN для получения дополнительной информации.

Для справки:

$ php -r '$a = ["test" => "1.25"]; echo json_encode($a) . PHP_EOL;' 
{"test":"1.25"} 
     ^
$ php -r '$a = ["test" => 1.25]; echo json_encode($a) . PHP_EOL;' 
{"test":1.25} 
     ^
+0

У меня есть полный контроль над стороной, которая генерирует данные, однако я ее вообще не разбираю. Я делаю это вот так: '$ grabme = $ db-> query (" SELECT * FROM sometable WHERE somecol = '$ somecol' ORDER BY ID DESC "); $ res = $ grabme-> fetchAll (PDO :: FETCH_ASSOC); $ data ['nodes'] = $ res; ' Который я в основном эхо как json позже. Хотел бы я итерации по массиву '$ data ['nodes']' и удалять кавычки вокруг значений 'x' и' y'? Каким будет самый эффективный способ сделать это, не нарушая остальную часть порядка данных? –

+0

Ах, да, я столкнулся с этой точной проблемой в одном из наших маленьких скриптов python, и мы исправили ее, используя способность python lib указывать типы разных полей, поэтому при получении результатов они уже были бы приписаны к нужному типу (что также сэкономило много времени на ручной конвертации). Я не знаю, возможно ли это или нет с PDO PHP (сомневайтесь в нем). Но если вы определенно знаете, какие поля должны быть целыми/float в ответе (x, y в нашем примере), тогда просто преобразуйте их вручную сразу после их извлечения: –

+1

'' 'foreach ($ data ['nodes'] as $ k => $ v) {$ v ['x'] = intval ($ v ['x']); $ v ['y'] = intval ($ v ['y']); $ data ['nodes'] [$ k] = $ v; } '' ' –

1

Вы можете использовать parseInt для преобразования строкового значения в целое число.

var x = parseInt(jsonObj.get("x"), 10); 

10 - использование базы 10 при разборе.

+0

Спасибо! Но я выбрал метод php, поскольку он прост и происходит на сервере, а не на стороне клиента. Как-то чувствует себя безопаснее. Но это тоже хорошо! –

+0

Спасибо за отзыв, рад, что вы поняли это с помощью PHP – Loaf

Смежные вопросы