为什么2.x的JSONObject直接改成继承LinkedHashMap?
1.x的版本在创建JSONObject对象的时候,可以选择hashMap或者LinkdHashMap,但是2.x版本继承linkedHashMap就只能选择linkedHashMap,请问是有什么考虑吗?是从性能考虑?还是其他的呢?请问,不能像1.x版本一样自己选择吗?
原提问者GitHub用户xiaohuang1024
是考虑到最常用的场景是要保留顺序的,所以就用了继承自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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。