alibaba / fastjson2

🚄 FASTJSON2 is a Java JSON library with excellent performance.
Apache License 2.0
3.8k stars 497 forks source link

JSONObject通过下标获取对应的值 #3135

Open lilanlong opened 1 month ago

lilanlong commented 1 month ago

请描述您的需求或者改进建议

现在JSONObject是继承LinkedHashMap实现的,是有序的,我想通过下标来获取JSONObject中的值。

请描述你建议的实现方案

现在Map中的key是通过Set存储的,无法通过下标获取key,进而获得相应的值,我想在JSONObject类中增加ArrayList来维护Map的key,在增加或者删除值的时候,都来更新这个ArrayList,这样就很容易实现通过下标获取对应的值了,不知道是否可行。

描述您考虑过的替代方案

对您考虑过的任何替代解决方案或功能的描述。

附加信息

如果你还有其他需要提供的信息,可以在这里填写(可以提供截图、视频等)。

wenshao commented 4 weeks ago

为什么有这个需求?java.util.LinkedHashMap也不会提供下标获取值的接口

lilanlong commented 4 weeks ago

是的,LinkedHashMap的确没有提供,只是在工作开发过程中,有些SQL非常复杂,公司也没有定义实体来接收SQL查询返回的值,而是用JSONObject直接接收了,SQL中的别名也没有规律,反而通过下标取值更加方便,当然我们可以通过keySet来找到与下标的关系,但是性能上损耗的比较多。

CodePlayer commented 4 weeks ago

你如果喜欢通过下标取值,为啥要用 Map 来接收呢 ?直接用 Object[] 数组就可以呀。

即使 LinkedHashMap 是有序的,但它的 底层实现 和 纯数组 完全是两码事。

即使你不想自己处理,担心性能损耗,但是技术实现是没有完全的黑魔法的,你这里不实现,就必定要别人那里去实现,底层也需要维护两套数据结构的元数据,才能同时支持两种取值方式。这样和你自己实现所产生的性能开销是没有什么差别的。

而且为了提供这个支持,就必须内置到 JSONObecjt 里面,哪怕别人没有你这个小众需求,也会因此受到负面的性能影响(因为 JSONObecjt 底层还是要维护两套数据结构元数据)。

lilanlong commented 4 weeks ago

是的,在我提这个建议之前,我也想过你说的这些问题,最后想想还是提一下吧,如果对fastjson有意义,就进行实现,没有意义忽略即可。