首页
学习
活动
专区
圈层
工具
发布

Jayway JsonPath read long Java

Jayway JsonPath 读取长整型数值问题解析

基础概念

Jayway JsonPath 是一个 Java 库,用于从 JSON 文档中提取数据,类似于 XPath 对 XML 的操作。它提供了一种简洁的方式来查询和操作 JSON 数据。

读取长整型(long)数值的问题

当使用 Jayway JsonPath 读取 JSON 中的长整型数值时,可能会遇到以下问题:

  1. 精度丢失:JSON 规范不区分整数和浮点数,所有数字都是 Number 类型
  2. 类型转换问题:JsonPath 默认可能将大整数转换为 Double 或 Integer,导致精度丢失
  3. 溢出问题:当数值超过 Integer.MAX_VALUE 时,自动转换会出错

原因分析

  1. JSON 本身没有长整型的概念,所有数字都是统一处理
  2. Jayway JsonPath 默认配置可能使用 Double 或 Integer 来解析数字
  3. Java 的 Long 类型需要特殊处理才能正确映射

解决方案

1. 使用 Configuration 指定数字解析方式

代码语言:txt
复制
Configuration conf = Configuration.builder()
    .jsonProvider(new JacksonJsonNodeJsonProvider())
    .mappingProvider(new JacksonMappingProvider())
    .options(Option.SUPPRESS_EXCEPTIONS)
    .build();

Object document = Configuration.defaultConfiguration().jsonProvider().parse(jsonString);
Long value = JsonPath.using(conf).parse(document).read("$.longValue", Long.class);

2. 使用类型转换

代码语言:txt
复制
String json = "{\"id\": 1234567890123456789}";
DocumentContext ctx = JsonPath.parse(json);
long id = ctx.read("$.id", Long.class);

3. 使用 BigDecimal 作为中间类型

代码语言:txt
复制
String json = "{\"bigNumber\": 1234567890123456789}";
BigDecimal bigDecimal = JsonPath.read(json, "$.bigNumber", BigDecimal.class);
long longValue = bigDecimal.longValue();

4. 自定义 JsonProvider

代码语言:txt
复制
public class CustomJsonProvider extends AbstractJsonProvider {
    @Override
    public Object createArray() {
        return new ArrayList<>();
    }

    @Override
    public Object createMap() {
        return new LinkedHashMap<>();
    }

    @Override
    public Object parse(String json) throws ParseException {
        ObjectMapper mapper = new ObjectMapper();
        try {
            return mapper.readValue(json, Object.class);
        } catch (IOException e) {
            throw new ParseException(e);
        }
    }

    @Override
    public Object getArrayIndex(Object obj, int idx) {
        return ((List<?>) obj).get(idx);
    }

    @Override
    public Object getMapValue(Object obj, String key) {
        return ((Map<?, ?>) obj).get(key);
    }

    @Override
    public boolean isArray(Object obj) {
        return obj instanceof List;
    }

    @Override
    public boolean isMap(Object obj) {
        return obj instanceof Map;
    }
}

// 使用自定义 Provider
Configuration conf = Configuration.builder()
    .jsonProvider(new CustomJsonProvider())
    .build();

应用场景

  1. 处理大整数 ID(如 Twitter 的雪花算法 ID)
  2. 金融计算中的大数值处理
  3. 时间戳处理(毫秒级或纳秒级时间戳)
  4. 科学计算中的大数值

最佳实践

  1. 明确指定目标类型(如 Long.class)
  2. 对于特别大的数值,考虑使用字符串表示并在应用中转换
  3. 使用 Jackson 或 Gson 作为底层解析器以获得更好的类型支持
  4. 在不确定数值范围时,优先使用 BigDecimal 作为中间类型

示例代码

代码语言:txt
复制
import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.DocumentContext;
import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.Option;

public class JsonPathLongExample {
    public static void main(String[] args) {
        String json = "{\"timestamp\": 1640995200000, \"userId\": 1234567890123456789}";
        
        // 方法1:直接读取为Long
        Long timestamp = JsonPath.read(json, "$.timestamp", Long.class);
        System.out.println("Timestamp: " + timestamp);
        
        // 方法2:使用DocumentContext
        DocumentContext ctx = JsonPath.parse(json);
        Long userId = ctx.read("$.userId", Long.class);
        System.out.println("User ID: " + userId);
        
        // 方法3:使用自定义配置
        Configuration conf = Configuration.defaultConfiguration()
            .addOptions(Option.DEFAULT_PATH_LEAF_TO_NULL);
        Long safeRead = JsonPath.using(conf).parse(json).read("$.timestamp", Long.class);
        System.out.println("Safe read: " + safeRead);
    }
}

通过以上方法,可以确保在使用 Jayway JsonPath 时正确处理长整型数值,避免精度丢失和类型转换问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • java long string 转换_Java long 转成 String的实现

    Java long 转成 String的实现 第一种: String s = String.valueOf(long) 第二种: String s = Long.toString(long) 补充知识:...解决:Java 把Long转换成日期再转换成String类型 1、把long类型数值转成日期类型 2、使用SimpleDateFormat 转换成具体格式的字符串类型 贴代码 import java.text.SimpleDateFormat...long 转成 String的实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。...转String常用的两种方法: long n=scanner.nextLong(); String s=Long.toString(n);//第一种方法 String s=String.valueOf(...Java对象实现的演进 String对象是Java中使用最频繁的对象之一,所以Java开发者们也在不断地对String对象的实现进行优化,以便提升String对象的性能.

    2.5K20

    java integer long 转换_long(Long)与int(Integer)之间的转换

    1.将long型转化为int型,这里的long型是基础类型: long a = 10; int b = (int)a; 2.将Long型转换为int 型的,这里的Long型是包装类型: Long a =...10; int b=a.intValue(); 3.将Long型转换为 Integer 型的,这里的Long型是包装类型: Long a = 10;; Integer b=a.intValue();...4.将int型转化为long型,这里的int型是基础类型: int a = 10;long b = (int)a; 5.将Integer型转化为long型,这里的Integer型是包装类型: int a...(); 总结:这里的转化就是要注意Java的八种基础数据类型以及八种包装数据类型的区别 基本类型和封装类的转换 Int转Integer: Integer integer = new Integer(int...integer.intValue(); Double转double: double b = Double.doubleValue(); Float转float: float c = Float.floatValue(); Java

    6.5K20
    领券
    首页
    学习
    活动
    专区
    圈层
    工具
    MCP广场