JSONArray.fromObject转换float类型的问题

本文介绍了一个在使用JSONArray.fromObject方法转换浮点数时遇到精度问题的解决方案。通过自定义一个处理浮点数的JsonValueProcessor,并在JSON配置器中注册,可以将浮点数以更精确的形式展示。此方法适用于需要精准处理浮点数场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我用JSONArray.fromObject转换一个float类型时,比如定义一个float f = 0.1f 
JSONArray array = JSONArray.fromObject(f) 

array.toString后打印出来的是[0.10000000149011612]


解决方法:

专门写个float类型的出来方法,然后注册到JSON配置器中,具体如下:

package com.heivr.webapp.authority.util;

import java.math.RoundingMode;
import java.text.NumberFormat;
import java.util.Locale;

import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;

public class JsonFloatValueProcessor implements JsonValueProcessor {

	public JsonFloatValueProcessor() { }

	/**
	 * 处理数组类型
	 */
	public Object processArrayValue(Object value, JsonConfig jsonConfig) {
		
		if (value instanceof float[]) {
			
			String[] obj = {};
			
			float[] nums = (float[]) value;
			
			for (int i = 0; i < nums.length; i++) {
				obj[i] = roundHalfUp(nums[i], 3);
			}
			
			return obj;
		}
		
		return value;
	}

	/**
	 * 处理单个对象
	 */
	public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) {
		
		if (value instanceof Float) {
			return roundHalfUp((Float)value, 3);
		}
		
		return value;
	}
	
	/**
     * 四舍五入。
     * 
     * @param number 数值
     * @return 舍入后的数值
     * @see java.text.RoundingMode.HALF_UP
     */
    public String roundHalfUp(double number, int frac) {
    	NumberFormat fmt = NumberFormat.getInstance(Locale.CHINA);
    	
    	fmt.setMaximumFractionDigits(frac);
    	fmt.setRoundingMode(RoundingMode.HALF_UP);
    	
    	return fmt.format(number);
    }
}

然后注册处理器:

JsonConfig jsonConfig = new JsonConfig();
jsonConfig.registerJsonValueProcessor(Float.class, new JsonFloatValueProcessor());
String resourceJSON = JSONArray.fromObject(list, jsonConfig).toString();

 

<think>好的,我现在需要解释如何将QJsonDocument转换为QJsonArray,并说明这是否是数据类型转换。首先,我得回忆一下Qt中处理JSON的相关类。QJsonDocument是用来读写JSON文档的类,它可以处理对象和数组两种结构。QJsonArray则是表示JSON数组的数据类型。 用户的问题可能是在处理从文件或网络获取的JSON数据时,需要从QJsonDocument中提取出QJsonArray。比如,如果JSON文档的顶层结构是一个数组,那么直接调用QJsonDocument的array()方法就能得到QJsonArray。如果是对象,可能需要先获取对象,再从中取出数组。 接下来要考虑用户可能的误区。他们可能认为转换数据类型涉及到复杂的操作,但实际上Qt提供了直接的方法。需要明确说明何时可以使用array()方法,以及如何处理不同结构的情况。例如,如果文档是对象而不是数组,直接调用array()会返回空数组,这时候需要检查文档结构,或者通过对象中的某个键来获取数组。 还需要区分数据类型转换和结构提取的不同。QJsonDocument本身可以包含数组或对象,所以转换到QJsonArray实际上是提取其内部存储的数组结构,而不是传统意义上的类型转换。这里的数据类型是QJsonValue的不同形式,而转换的正确性取决于文档的实际内容。 可能还需要给出示例代码,展示如何安全地进行转换,比如先判断isArray(),再调用array()。这样用户在实际编码时可以避免错误。同时,提醒用户检查文档是否有效,避免空文档导致的异常。 最后总结,转换的关键在于理解QJsonDocument的结构,并正确提取其中的数组部分,而不是改变数据本身的类型。确保用户明白这属于结构访问而非类型转换,从而正确使用Qt的JSON API。</think>在 Qt 框架中,`QJsonDocument` 和 `QJsonArray` 是处理 JSON 数据的核心类。它们的“转换”本质是**对 JSON 数据结构的访问和提取**,而非传统意义上的数据类型转换(如 `int` 转 `float`)。以下是关键点说明: --- ### 1. **QJsonDocument 的作用** - 表示一个完整的 JSON 文档,可以是两种形式: - **对象**(`{}` 包裹,键对结构,对应 `QJsonObject`) - **数组**(`[]` 包裹,有序列表结构,对应 `QJsonArray`) - 它负责 JSON 的解析、序列化和存储,但不直接操作数据内容。 --- ### 2. **如何从 QJsonDocument 获取 QJsonArray** - 若 JSON 文档的**根结构是数组**,直接调用: ```cpp QJsonArray array = jsonDocument.array(); ``` - 若根结构是对象,需通过键名提取数组: ```cpp QJsonObject rootObject = jsonDocument.object(); QJsonArray array = rootObject["key"].toArray(); ``` --- ### 3. **重要注意事项** - **检查结构类型**:使用 `jsonDocument.isArray()` 判断根结构是否为数组,避免直接转换导致空数组。 - **有效性验证**:确保 `QJsonDocument` 本身有效(非空且解析正确),可通过 `jsonDocument.isNull()` 检查。 - **数据类型安全**:提取时使用 `toArray()`、`toObject()` 等转换方法,必要时配合 `isArray()`、`isObject()` 做类型校验。 --- ### 4. **示例代码** ```cpp // 假设 jsonString 是一个有效的 JSON 数组字符串,例如 "[1, 2, 3]" QJsonDocument doc = QJsonDocument::fromJson(jsonString.toUtf8()); if (!doc.isNull() && doc.isArray()) { QJsonArray jsonArray = doc.array(); // 现在可以遍历 jsonArray 操作数据 for (const QJsonValue &value : jsonArray) { qDebug() << value.toInt(); } } else { qDebug() << "Invalid JSON or root is not an array!"; } ``` --- ### 5. **总结** - **转换的本质**:通过 `QJsonDocument` 提供的方法(如 `array()`)访问其内部存储的 JSON 数据结构。 - **关键区别**:`QJsonDocument` 是 JSON 的容器,而 `QJsonArray` 是具体的数据结构,转换过程是“提取”而非“类型强转”。 - **错误处理**:始终验证文档有效性和结构类型,避免运行时崩溃。 理解这一点后,你可以更安全地操作 JSON 数据,并根据实际结构灵活提取对象或数组。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值