json_decode округляет поплавки, как я могу это предотвратить?

У меня есть довольно большой файл json с координатами в следующем формате

"[[3.2,1],[4.8,2]]"

что представляет (3.2,1) и (4.8,2)

Я использую эти координаты для создания географической карты D3, но когда php моделирует эту информацию в объект geoJSON, я сталкиваюсь со следующей ошибкой:

Мне нужно преобразовать координаты в массив, для которого я использую json_decode. Однако:

json_decode("[[3.2,1],[4.8,2]]")

возвращается

Array
(
[0] => Array
    (
        [0] => 3
        [1] => 1
    )
[1] => Array
    (
        [0] => 4
        [1] => 2
    )
)

Где я теряю десятичные дроби. Как я могу предотвратить это?

Редактировать:

{"type": "FeatureCollection",
 "features": [{
        "type": "Feature",
        "geometry": {
            "type": "Polygon",
            "coordinates": "[[[8.7, 11], [8.89, 12.13],[9.27, 12.13], [9.9, 12], [9.7, 10.8], [8.7, 11]]]"
        },
        "properties": {
            "name": "04",
            "count": "25"
        }
    }]
}

Это пример данных, которые я получаю в качестве вывода. (Предполагается, что он представляет собой карту комнат, которые получают цвет плотности при его использовании)

Я могу разобрать это с помощью jQuery.parseJSON(data), но выполнение следующего кода D3 приводит к самым странным ошибкам:

val(svgname).append("g")
    .selectAll("path")
    .data(geoJSONobject.features)
    .enter().append("path")
    .attr("d", path)
    ...

errorЯ думаю, это из-за кавычек вокруг массива координат.

Изменить (2) - фактическое решение

Решение, которое я принял, было обходным путем, но настоящая проблема заключалась в локализованных настройках php. с использованием:

echo json_encode($dataset, JSON_NUMERIC_CHECK);

в php-файле все вопросы были решены. Хотя я бы обновил вопрос, так как он все еще рассматривается (если кто-нибудь решит проблему)


person dietervdf    schedule 09.07.2015    source источник
comment
какую версию PHP вы используете? Я использую 5.5.12, и он оставляет их как поплавки.   -  person Tom Jardine-McNamara    schedule 09.07.2015
comment
Я не знаю, что вызывает это, но, возможно, как обходной путь: возможно, передайте их как строки, а затем преобразуйте их в числа с плавающей запятой, когда вы получите координаты.   -  person Erwin Moller    schedule 09.07.2015
comment
В документах (php.net/json_decode) упоминается приведение больших целых чисел к числам с плавающей запятой, но ваш не выглядит очень большой;) Предложение @ErwinMoller об использовании строк будет абсолютно работать. Другое дело, интересно ли вам, почему это происходит с вами.   -  person Tom Jardine-McNamara    schedule 09.07.2015
comment
Выглядит хорошо для 5.2.0 - 7.0.0alpha2 3v4l.org/rtamO#v520 var_dump() переменной, содержащей JSON.   -  person AbraCadaver    schedule 09.07.2015
comment
Я все еще использую php 5.2.4, обновление, к сожалению, невозможно... Можно ли подробнее остановиться на методе передачи строк?   -  person dietervdf    schedule 09.07.2015
comment
Это очень просто, он просто имеет в виду хранить их как строки, а когда вам нужно их использовать, преобразовывать их в числа с плавающей запятой.   -  person Overcode    schedule 09.07.2015
comment
Просто заключите значения в кавычки: json_decode('[["3.2","1"],["4.8","2"]]');   -  person Travesty3    schedule 09.07.2015
comment
Приведите минимальный пример в соответствии с рекомендациями SO. Кроме того, смешивание некоторых утверждений jQuery также не помогает прояснить проблему.   -  person Ulrich Eckhardt    schedule 09.07.2015
comment
Проблема решается применением решения @Travety3. Я бы с радостью принял это решение, если бы он опубликовал его как ответ.   -  person dietervdf    schedule 09.07.2015


Ответы (2)


Просто заключите значения в кавычки: json_decode('[["3.2","1"],["4.8","2"]]');

person Travesty3    schedule 09.07.2015
comment
Это обходной путь, а не решение. Он основан на динамической типизации в PHP и/или ECMAScript, где "3.1" и 3.1 интерпретируются в зависимости от контекста. Формально "3.1" в JSON — это строка, а 3.1 — тип с плавающей запятой, и любой достойный декодер JSON должен уметь его декодировать. - person Ulrich Eckhardt; 10.07.2015
comment
Что ж, я думаю, решение будет заключаться в том, чтобы работать с последней версией php. Поскольку Том Дженкинс и другие подтвердили, что это работает на их машинах. К сожалению, я не могу выполнить обновление. Между тем это решило мою проблему, поэтому я пометил ее как решение. - person dietervdf; 10.07.2015

У меня такая же проблема. Я решил это, используя следующее регулярное выражение

РЕШЕНИЕ 1

$yourJsonVariable = preg_replace('/:\s*(\-?\d+(\.\d+)?([e|E][\-|\+]\d+)?)/', ': "$1"', $yourJsonVariable);

Превратите его в массив

$array = json_decode($yourJsonVariable, true);

Кредиты принадлежат этому SO LINK

РЕШЕНИЕ 2

Вы можете установить ini_set('precision',1);

РЕШЕНИЕ 3

$decoded = json_decode($encoded, true, null, JSON_BIGINT_AS_STRING);

ПРИМЕЧАНИЕ. Решение Last будет работать только для PHP > 5.4.

Вы можете просмотреть этот блог

person Abhinav    schedule 09.07.2015
comment
Должен быть отмечен как правильный ответ! Предложенное как решение 1 сработало для меня как шарм - person Ragen Dazs; 13.11.2017
comment
После некоторых тестов регулярное выражение сопоставляет числа внутри кавычек /:\s*(?!\B"[^"]*)(\-?\d+(\.\d+)?([e|E][\-|\+]\d+)?)(?![^"]*"\B)/ это условие будет заключать в кавычки только те числа, которые еще не заключены в кавычки - person Ragen Dazs; 13.11.2017