开发者社区> 问答> 正文

为什么2.x的JSONObject直接改成继承LinkedHashMap?

为什么2.x的JSONObject直接改成继承LinkedHashMap?

1.x的版本在创建JSONObject对象的时候,可以选择hashMap或者LinkdHashMap,但是2.x版本继承linkedHashMap就只能选择linkedHashMap,请问是有什么考虑吗?是从性能考虑?还是其他的呢?请问,不能像1.x版本一样自己选择吗?

原提问者GitHub用户xiaohuang1024

展开
收起
后端老大 2023-04-21 11:14:01 151 0
1 条回答
写回答
取消 提交回答
  • 是考虑到最常用的场景是要保留顺序的,所以就用了继承自LinkedHashMap,继承比包装一层会性能略好。你可以通过配置JSONReader.Context.objectSupplier,按你的需要使用那种Map

    如下的例子,在fastjson2中,你可以很方便定制指定构造json object对应的Map

    assertEquals( HashMap.class, JSON.parse( "{}", JSONFactory.createReadContext( () -> new HashMap() // 指定objectSupplier为 HashMap ) ).getClass() );

    assertEquals( LinkedHashMap.class, JSON.parse( "{}", JSONFactory.createReadContext( () -> new LinkedHashMap() // 指定objectSupplier为 LinkedHashMap ) ).getClass() );

    assertEquals( TreeMap.class, JSON.parse( "{}", JSONFactory.createReadContext( () -> new TreeMap() // 指定objectSupplier为 TreeMap ) ).getClass() );

    assertEquals( ConcurrentHashMap.class, JSON.parse( "{}", JSONFactory.createReadContext( () -> new ConcurrentHashMap() // 指定objectSupplier为 ConcurrentHashMap ) ).getClass() );

    如下的例子,在fastjson2中,你可以很方便定制指定构造json array对应的List

    assertEquals( ArrayList.class, JSON.parse( "[]", JSONFactory.createReadContext( null, () -> new ArrayList()) // 指定arraySupplier为 ArrayList ).getClass() );

    assertEquals( LinkedList.class, JSON.parse( "[]", JSONFactory.createReadContext( null, () -> new LinkedList()) // 指定arraySupplier为 LinkedList ).getClass() );

    assertEquals( ArrayDeque.class, JSON.parse( "[]", JSONFactory.createReadContext( null, () -> new ArrayDeque()) // 指定arraySupplier为 ArrayDeque ).getClass() );

    新的API如下:

    JSONFactory.setDefaultObjectSupplier( () -> new TreeMap() // 全局指定objectSupplier为 TreeMap ); assertEquals( TreeMap.class, JSON.parse("{}").getClass() );

    JSONFactory.setDefaultObjectSupplier( () -> new ConcurrentHashMap() // 全局指定objectSupplier为 ConcurrentHashMap ); assertEquals( ConcurrentHashMap.class, JSON.parse("{}").getClass() );

    JSONFactory.setDefaultArraySupplier( () -> new LinkedList() // 全局指定arraySupplier为 LinkedList ); assertEquals( LinkedList.class, JSON.parse("[]").getClass() );

    JSONFactory.setDefaultArraySupplier( () -> new CopyOnWriteArrayList() // 全局指定arraySupplier为 CopyOnWriteArrayList ); assertEquals( CopyOnWriteArrayList.class, JSON.parse("[]").getClass() );

    原回答者GitHub用户wenshao

    2023-04-21 14:11:48
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载