JSONArray (jsonstring) отбрасывает десятичное число, если 0

У меня есть строка json с плавающими значениями: {"foo":10.0,"bar":12.005} Мне нужно преобразовать его, используя JSONObject(jsonstring), и мне нужно сохранить десятичные дроби, но массив json отбрасывает их, если они равны нулю. Результат выглядит так {"foo":10,"bar":12.005}

Я ожидал, что смогу предоставить дополнительные параметры для управления типом данных, но в соответствии с https://developer.android.com/reference/org/json/JSONObject нет такого варианта. Я также искал google и stackoverflow, но не нашел похожих проблем.

Вы должны читать параметр как String вместо Double для этого сценария.

Zohaib Amir 24.07.2019 14:04

пожалуйста, подтвердите ответ, если он правильный ..

Paul P Joby 25.07.2019 16:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
3 830
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Я думаю, это не проблема массива JSON, а скорее преобразование типа языка из float в int.

Используйте что-то подобное для форматирования float в строку String.format("%,.2f", val);

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

Рабочий процесс будет проходить следующим образом:

if (Math.ceil(val)==val){ //a number with no fractional points

    String str = String.format("%,.2f", val);
}
else //use_the_floating_number_as_usual

Это будет работать, но вам нужно будет заранее знать количество знаков после запятой, которое вы жестко запрограммировали как .2f

Zohaib Amir 24.07.2019 14:04

@ZohaibAmir Я ответил на вопрос о том, как мы можем подойти к решению, а не к серебряной пуле. Обновил мой ответ, хотя.

touhid udoy 24.07.2019 14:24

Это ожидаемое поведение.

Поле DECIMAL преобразуется в тип данных JSON NUMBER. Этот тип по умолчанию обрезает конечные нули.

Клиент/получатель JSON должен решить, сколько знаков после запятой нужно отображать, и установить правильный формат отображения.

«Это ожидаемое поведение» не является ответом, когда OP хочет другого поведения. Вместо этого вы должны были опубликовать это как комментарий.

Zohaib Amir 24.07.2019 14:06

@ZohaibAmir Вам нужно 50 репутации, чтобы иметь возможность оставлять комментарии. И я думаю, что совершенно нормально напомнить ОП, что JSON должен работать именно так.

GhostCat 24.07.2019 14:14

@guaravuniverse Принятый ответ предоставил некоторые ресурсы плюс решение, поэтому я принял это. Но в конце концов я позволил получателю установить правильный формат, как вы также предложили, так что спасибо за это.

micha 31.07.2019 12:58

Для 10.0 он добавит значение в виде целого числа в JSON, если вы хотите его с десятичным числом, то сначала вам нужно преобразовать его в строку, а затем вам нужно поместить строковое значение в JSON.

val foo = 10.0
val bar = 12.005
val strFoo = foo.toString();
val jsonObject = JSONObject()
jsonObject.put("foo",strFoo)
jsonObject.put("bar", bar)

JSONObject всегда обрабатывает все как объекты, поэтому они должны быть преобразованы в плавающие путем их анализа.

     String json = "{\"foo\":10.0}";
     try{
            JSONObject jo = new JSONObject(json); 
            float f = Float.parseFloat(jo.get("foo").toString());
            System.out.println(f);
        }
     catch(Exception e){
            // Some parsing exception occurs
        }

Надеюсь, это решит проблему.

Также JSONObject поддерживает методы для получения элементов в различных типах данных, таких как double, int, boolean.

   double d = jo.getDouble("foo");
   System.out.println(d); // gave me 10.0

Точно так же у нас есть

   int i = getInt("name"); // which returns an integer 
   boolean b = getBoolean("name"); // Automatically parses 

Это на самом деле не помогает, так как мне нужно сохранить десятичные знаки в jsonObject, чтобы отправить его в API, который ожидает этот формат.

micha 31.07.2019 01:58

см. @micha, дело в том, что JSON по умолчанию поддерживает только эти типы данных: строка, число, логическое значение, null/пусто, объект, массив. В большинстве случаев мы анализируем его на тип данных, который нам требуется после получения его в виде строки. И тип данных Number, поддерживаемый JSON, также может обрабатывать дроби и целые числа. Попробуйте прочитать этот restfulapi.net/json-типы данных

Paul P Joby 31.07.2019 06:18

@micha Я добавил еще несколько методов, которые помогут вам выполнить свою работу. Надеюсь, что это помогает вам.

Paul P Joby 31.07.2019 06:34

спасибо за усилия, но это все еще не полезно для моего случая. Мне не нужно получать значение из jsonObject, мне нужно сохранить его внутри самого объекта. Принятый ответ дает правильное объяснение и решение, хотя для меня это немного излишне. Вместо этого я изменил свой API, чтобы справиться с этой проблемой.

micha 31.07.2019 12:48

отлично @micha !

Paul P Joby 31.07.2019 15:14
Ответ принят как подходящий

Невозможно получить количество цифр из JSON.parse или eval. Даже если бы десятичное предложение IBM было принято комитетом EcmaScript, число все равно будет преобразовано в число с плавающей запятой IEEE 754.

Взгляните на http://code.google.com/p/json-sans-eval/source/browse/trunk/src/json_sans_eval.js для простого синтаксического анализатора JSON, который вы можете изменить, чтобы сохранить информацию о точности.

решение уже предоставлено здесь

Как предотвратить удаление десятичной точки при разборе JSON?

Другие вопросы по теме