У меня есть строка 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, но не нашел похожих проблем.
пожалуйста, подтвердите ответ, если он правильный ..




Я думаю, это не проблема массива 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
@ZohaibAmir Я ответил на вопрос о том, как мы можем подойти к решению, а не к серебряной пуле. Обновил мой ответ, хотя.
Это ожидаемое поведение.
Поле DECIMAL преобразуется в тип данных JSON NUMBER. Этот тип по умолчанию обрезает конечные нули.
Клиент/получатель JSON должен решить, сколько знаков после запятой нужно отображать, и установить правильный формат отображения.
«Это ожидаемое поведение» не является ответом, когда OP хочет другого поведения. Вместо этого вы должны были опубликовать это как комментарий.
@ZohaibAmir Вам нужно 50 репутации, чтобы иметь возможность оставлять комментарии. И я думаю, что совершенно нормально напомнить ОП, что JSON должен работать именно так.
@guaravuniverse Принятый ответ предоставил некоторые ресурсы плюс решение, поэтому я принял это. Но в конце концов я позволил получателю установить правильный формат, как вы также предложили, так что спасибо за это.
Для 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, дело в том, что JSON по умолчанию поддерживает только эти типы данных: строка, число, логическое значение, null/пусто, объект, массив. В большинстве случаев мы анализируем его на тип данных, который нам требуется после получения его в виде строки. И тип данных Number, поддерживаемый JSON, также может обрабатывать дроби и целые числа. Попробуйте прочитать этот restfulapi.net/json-типы данных
@micha Я добавил еще несколько методов, которые помогут вам выполнить свою работу. Надеюсь, что это помогает вам.
спасибо за усилия, но это все еще не полезно для моего случая. Мне не нужно получать значение из jsonObject, мне нужно сохранить его внутри самого объекта. Принятый ответ дает правильное объяснение и решение, хотя для меня это немного излишне. Вместо этого я изменил свой API, чтобы справиться с этой проблемой.
отлично @micha !
Невозможно получить количество цифр из 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?
Вы должны читать параметр как String вместо Double для этого сценария.