标签: psychparser

JRuby 1.7.1和PsychParser错误解析UTF-8 YAML文件(Rails 3.2.8)

在我们的JRuby/Rails项目中,我们使用i18ngem,并支持日语和英语.我们的config/locales.ja.yml文件是UTF-8,没有任何BOM.

运行Rails 3.2.9JRuby 1.7.1,我们现在看到以下错误:

% jruby -S rake spec:models

 Psych::SyntaxError: (C:/Projects/foobar/trunk/config/locales/ja.yml): 
   expected <block end>, but found Scalar while parsing a block 
   mapping at line 7 column 33

   parse at org/jruby/ext/psych/PsychParser.java:213
   ... 
Run Code Online (Sandbox Code Playgroud)

解析ja.yml文件的YAML的这个错误现在在我们的Windows XP和Linux开发环境中发生,并且当我们为JVM显式设置以下系统参数时,似乎只会消失:

-Dfile.encoding=utf-8
Run Code Online (Sandbox Code Playgroud)

谁能告诉我为什么会这样JRuby 1.7.1
我没有看到这个1.6.81.7.0.

yaml jruby jrubyonrails psychparser

10
推荐指数
1
解决办法
789
查看次数

YAML:解析包含方括号作为第一个字符的字符串时出错

我正在 Ruby 中解析 YAML 文件,某些输入导致 Psych 语法错误:

require 'yaml'

example = "my_key: [string] string"
YAML.load(example)
Run Code Online (Sandbox Code Playgroud)

导致:

Psych::SyntaxError: (<unknown>): did not find expected key
          while parsing a block mapping at line 1 column 1
from [...]/psych.rb:456:in `parse'
Run Code Online (Sandbox Code Playgroud)

我从我无法控制的外部 API 收到此 YAML。我可以看到编辑输入以强制解析为字符串,使用my_key: '[string] string',如“我需要在 YAML 中为字符串添加引号吗?”中所述。,可以解决问题,但我无法控制如何接收输入。

有没有办法强制将输入解析为某些键(例如 )的字符串 my_key?是否有解决方法可以成功解析此 YAML?

ruby yaml psychparser

5
推荐指数
1
解决办法
9063
查看次数

使用ActiveRecord :: Base.connection.execute时进行批处理

我正在忙于编写一个迁移,该迁移将使我们能够将yamler从Syck迁移到Psych,并最终将项目升级到ruby2。尽管如此,该迁移将占用大量资源,因此我将需要使用分块。

我编写了以下方法来确认我计划使用的迁移结果能够产生预期的结果,并且可以在不停机的情况下完成。为了避免Active Record自动执行序列化,我需要使用ActiveRecord::Base.connection.execute

我描述转换的方法如下

 def show_summary(table, column_name)
  a = ActiveRecord::Base.connection.execute <<-SQL
   SELECT id, #{column_name} FROM #{table}
  SQL
  all_rows = a.to_a; ""
  problem_rows = all_rows.select do |row|
    original_string = Syck.dump(Syck.load(row[1]))
    orginal_object = Syck.load(original_string)

    new_string = Psych.dump(orginal_object)
    new_object = Syck.load(new_string)

    Syck.dump(new_object) != original_string rescue true
  end

problem_rows.map do |row|
  old_string = Syck.dump(Syck.load(row[1]))
  new_string = Psych.dump(Syck.load(old_string)) rescue "Parse failure"
  roundtrip_string = begin
    Syck.dump(Syck.load(new_string))
  rescue => e
    e.message
  end

  new_row = {}
  new_row[:id] = row[0]
  new_row[:original_encoding] = old_string
  new_row[:new_encoding] = roundtrip_string
  new_row
  end …
Run Code Online (Sandbox Code Playgroud)

activerecord ruby-on-rails batching syck psychparser

0
推荐指数
1
解决办法
1308
查看次数