当前位置: 首页 > 面试题库 >

您如何处理ActiveSupport :: JSON和JSON gem之间的冲突?

谭研
2023-03-14
问题内容

我为这个问题感到困惑。

ActiveSupport::JSON``to_json在各种核心对象上定义,JSON gem也是如此。但是,实现方式并不相同-
ActiveSupport版本需要参数,而JSON gem版本则不需要。

我安装了需要JSON gem的gem,但我的应用程序坏了。问题是我to_json在返回对象列表的控制器中使用,但是我想控制要返回的属性。

在系统中任何地方进行编码时,都会出现require 'json'此错误消息:

TypeError: wrong argument type Hash (expected Data)

我尝试了一些在线阅读的方法来修复它,但是没有任何效果。我最终重写了gem来ActiveSupport::JSON.decode代替JSON.parse

这行得通,但这是不可持续的…我不能每次都想使用需要JSON gem的gem时分叉gem。

更新: 解决此问题的最佳方法是升级到Rails 2.3或更高版本,从而对其进行了修复。


问题答案:

更新 此修复程序仅适用于 <2.3的Rails。正如Giles在下面提到的那样,他们使用几乎相同的技术在内部将其固定在2.3中。但是要当心json
gem先前对Rails兼容性
json/add/rails)的 尝试 ,如果明确要求,它将再次破坏一切。

您是说require 'json'语句本身引发该异常吗?还是说打电话给@something.to_json(:something => value)您时出现错误?后者是我所期望的,如果您在使用JSON gem时遇到问题,那么我不确定会发生什么。

我刚遇到oauth gem这个问题。在我的情况下,没有真正的冲突,因为oauth
gem不依赖于to_json实现。因此,问题在于JSON破坏了ActiveSupport声明。我通过在加载ActiveSupport之前只需要json来解决了这个问题。推杆

require 'json'

里面Rails::Initializer做了把戏(尽管没有把它放在块后面)。

这样,ActiveSupport可以代替默认的JSON实现。

现在,如果您使用的是实际上依赖于JSON实现的gem,to_json那么您就小了。这绝对是元编程中最糟糕的情况,我会提倡让Rails和JSON
gem开发人员解决冲突,尽管这会很痛苦,因为彼此之间都必须打破向后兼容性。

在短期内,gem作者可能能够通过支持这两种实现来弥合差距。根据宝石如何使用该方法,这或多或少是可行的。最坏的情况是使用官方分叉(即gemgem- rails)。



 类似资料:
  • 冲突合并一般是因为自己的本地做的提交和服务器上的提交有差异,并且这些差异中的文件改动,Git不能自动合并,那么就需要用户手动进行合并 如我这边执行git pull origin master 如果Git能够自动合并,那么过程看起来是这样的 拉取的时候,Git自动合并,并产生了一次提交。 如果Git不能够自动合并,那么会提示 这个时候我们就可以知道README.MD有冲突,需要我们手动解决,修改RE

  • 问题内容: 如何确保可以将代码检出到Eclipse或NetBeans中并在其中使用? 编辑:如果不签入与ide相关的文件,则每次签出项目时,都必须重新配置buildpath,包括所有这些内容。我不知道ant(尤其是从eclipse创建/导出的ant buildfile)是否可以与其他ide无缝配合使用。 问题答案: 明智的选择是“这样做”-除非您不使用多个IDE,否则您不知道您是否真的准备好使用多

  • 在将OpenSAML从1.1升级到2.6.1(需要xerces-impl依赖项)之后,启动时会出现以下堆栈: xerces-impl重新定义了一些jre类,并附带了重新定义一些jre接口的XML-API。DataType.DataTypeFactoryImpl来自xerces-impl。 我读过用Java/Maven处理“Xerces地狱”?并尝试排除XML-API,但xerces-impl抛出N

  • null JDBC URL:jdbc:ucanaccess://f://workspaceNetbeans/msaccessdb/data/datenbank2.accdb “用户名”和“密码”留空 “测试连接”-按钮会导致错误消息: 无法使用 net.ucanaccess.jdbc.ucanaccessDriver建立到jdbc:ucanaccess://f:\workspaceNetBeans

  • 问题内容: 我正在使用两个具有相同名称的python软件包。 http://www.alembic.io/updates.html https://pypi.python.org/pypi/alembic 是否有规范或Python方式处理名称冲突的两个软件包的安装?到目前为止,我在开发/构建过程中仅偶尔需要一个软件包,因此我一直在使用单独的virtualenv来处理冲突,但是这使构建步骤变得更加复

  • 问题内容: 我有一个带有模块的Maven项目 考虑一下 myModule 中的Junit,它需要打开 bar.txt ,其中maven的basedir是模块目录。 因此,打开文件 bar.txt : 当您在 intellij中* 启动相同的junit 时执行 BUT 时,此方法效果很好,但会失败,因为Intellij在项目目录而不是模块目录中设置了basedir。 * Intellij尝试打开而不