Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
011afb70
R
rails
项目概览
张重言
/
rails
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rails
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
011afb70
编写于
4月 19, 2011
作者:
J
Joshua Peek
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'multi_json' of
https://github.com/joshk/rails
into joshk-multi_json
上级
069e9b00
b2462180
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
42 addition
and
233 deletion
+42
-233
activesupport/activesupport.gemspec
activesupport/activesupport.gemspec
+2
-0
activesupport/lib/active_support/json/backends/jsongem.rb
activesupport/lib/active_support/json/backends/jsongem.rb
+0
-47
activesupport/lib/active_support/json/backends/yajl.rb
activesupport/lib/active_support/json/backends/yajl.rb
+0
-44
activesupport/lib/active_support/json/backends/yaml.rb
activesupport/lib/active_support/json/backends/yaml.rb
+0
-113
activesupport/lib/active_support/json/decoding.rb
activesupport/lib/active_support/json/decoding.rb
+37
-23
activesupport/test/json/decoding_test.rb
activesupport/test/json/decoding_test.rb
+3
-6
未找到文件。
activesupport/activesupport.gemspec
浏览文件 @
011afb70
...
...
@@ -16,4 +16,6 @@
s
.
files
=
Dir
[
'CHANGELOG'
,
'README.rdoc'
,
'lib/**/*'
]
s
.
require_path
=
'lib'
s
.
add_dependency
(
'multi_json'
,
'~> 1.0.0.rc3'
)
end
activesupport/lib/active_support/json/backends/jsongem.rb
已删除
100644 → 0
浏览文件 @
069e9b00
require
'json'
unless
defined?
(
JSON
)
module
ActiveSupport
module
JSON
module
Backends
module
JSONGem
ParseError
=
::
JSON
::
ParserError
extend
self
# Parses a JSON string or IO and convert it into an object
def
decode
(
json
)
if
json
.
respond_to?
(
:read
)
json
=
json
.
read
end
data
=
::
JSON
.
parse
(
json
)
if
ActiveSupport
.
parse_json_times
convert_dates_from
(
data
)
else
data
end
end
private
def
convert_dates_from
(
data
)
case
data
when
nil
nil
when
DATE_REGEX
begin
DateTime
.
parse
(
data
)
rescue
ArgumentError
data
end
when
Array
data
.
map!
{
|
d
|
convert_dates_from
(
d
)
}
when
Hash
data
.
each
do
|
key
,
value
|
data
[
key
]
=
convert_dates_from
(
value
)
end
else
data
end
end
end
end
end
end
activesupport/lib/active_support/json/backends/yajl.rb
已删除
100644 → 0
浏览文件 @
069e9b00
require
'yajl'
unless
defined?
(
Yajl
)
module
ActiveSupport
module
JSON
module
Backends
module
Yajl
ParseError
=
::
Yajl
::
ParseError
extend
self
# Parses a JSON string or IO and convert it into an object
def
decode
(
json
)
data
=
::
Yajl
::
Parser
.
new
.
parse
(
json
)
if
ActiveSupport
.
parse_json_times
convert_dates_from
(
data
)
else
data
end
end
private
def
convert_dates_from
(
data
)
case
data
when
nil
nil
when
DATE_REGEX
begin
DateTime
.
parse
(
data
)
rescue
ArgumentError
data
end
when
Array
data
.
map!
{
|
d
|
convert_dates_from
(
d
)
}
when
Hash
data
.
each
do
|
key
,
value
|
data
[
key
]
=
convert_dates_from
(
value
)
end
else
data
end
end
end
end
end
end
activesupport/lib/active_support/json/backends/yaml.rb
已删除
100644 → 0
浏览文件 @
069e9b00
require
'active_support/core_ext/string/starts_ends_with'
module
ActiveSupport
module
JSON
module
Backends
module
Yaml
ParseError
=
::
StandardError
extend
self
EXCEPTIONS
=
[
::
ArgumentError
]
# :nodoc:
begin
require
'psych'
EXCEPTIONS
<<
Psych
::
SyntaxError
rescue
LoadError
end
# Parses a JSON string or IO and converts it into an object
def
decode
(
json
)
if
json
.
respond_to?
(
:read
)
json
=
json
.
read
end
YAML
.
load
(
convert_json_to_yaml
(
json
))
rescue
*
EXCEPTIONS
=>
e
raise
ParseError
,
"Invalid JSON string: '%s'"
%
json
end
protected
# Ensure that ":" and "," are always followed by a space
def
convert_json_to_yaml
(
json
)
#:nodoc:
require
'strscan'
unless
defined?
::
StringScanner
scanner
,
quoting
,
marks
,
pos
,
times
=
::
StringScanner
.
new
(
json
),
false
,
[],
nil
,
[]
while
scanner
.
scan_until
(
/(\\['"]|['":,\\]|\\.|[\]])/
)
case
char
=
scanner
[
1
]
when
'"'
,
"'"
if
!
quoting
quoting
=
char
pos
=
scanner
.
pos
elsif
quoting
==
char
if
valid_date?
(
json
[
pos
..
scanner
.
pos
-
2
])
# found a date, track the exact positions of the quotes so we can
# overwrite them with spaces later.
times
<<
pos
end
quoting
=
false
end
when
":"
,
","
,
"]"
marks
<<
scanner
.
pos
-
1
unless
quoting
when
"
\\
"
scanner
.
skip
(
/\\/
)
end
end
if
marks
.
empty?
json
.
gsub
(
/\\([\\\/]|u[[:xdigit:]]{4})/
)
do
ustr
=
$1
if
ustr
.
start_with?
(
'u'
)
char
=
[
ustr
[
1
..-
1
].
to_i
(
16
)].
pack
(
"U"
)
# "\n" needs extra escaping due to yaml formatting
char
==
"
\n
"
?
"
\\
n"
:
char
elsif
ustr
==
'\\'
'\\\\'
else
ustr
end
end
else
left_pos
=
[
-
1
].
push
(
*
marks
)
right_pos
=
marks
<<
scanner
.
pos
+
scanner
.
rest_size
output
=
[]
left_pos
.
each_with_index
do
|
left
,
i
|
scanner
.
pos
=
left
.
succ
chunk
=
scanner
.
peek
(
right_pos
[
i
]
-
scanner
.
pos
+
1
)
if
ActiveSupport
.
parse_json_times
# overwrite the quotes found around the dates with spaces
while
times
.
size
>
0
&&
times
[
0
]
<=
right_pos
[
i
]
chunk
.
insert
(
times
.
shift
-
scanner
.
pos
-
1
,
'! '
)
end
end
chunk
.
gsub!
(
/\\([\\\/]|u[[:xdigit:]]{4})/
)
do
ustr
=
$1
if
ustr
.
start_with?
(
'u'
)
char
=
[
ustr
[
1
..-
1
].
to_i
(
16
)].
pack
(
"U"
)
# "\n" needs extra escaping due to yaml formatting
char
==
"
\n
"
?
"
\\
n"
:
char
elsif
ustr
==
'\\'
'\\\\'
else
ustr
end
end
output
<<
chunk
end
output
=
output
*
" "
output
.
gsub!
(
/\\\//
,
'/'
)
output
end
end
private
def
valid_date?
(
date_string
)
begin
date_string
=~
DATE_REGEX
&&
DateTime
.
parse
(
date_string
)
rescue
ArgumentError
false
end
end
end
end
end
end
activesupport/lib/active_support/json/decoding.rb
浏览文件 @
011afb70
require
'active_support/core_ext/module/attribute_accessors'
require
'active_support/core_ext/module/delegation'
require
'multi_json'
module
ActiveSupport
# Look for and parse json strings that look like ISO 8601 times.
mattr_accessor
:parse_json_times
module
JSON
# Listed in order of preference.
DECODERS
=
%w(Yajl Yaml)
class
<<
self
attr_reader
:parse_error
delegate
:decode
,
:to
=>
:backend
def
decode
(
json
,
options
=
{})
data
=
MultiJson
.
decode
(
json
,
options
)
if
ActiveSupport
.
parse_json_times
convert_dates_from
(
data
)
else
data
end
end
def
backend
set_default_backend
unless
defined?
(
@backend
)
@backend
def
engine
MultiJson
.
engine
end
alias
:backend
:engine
def
backend
=
(
name
)
if
name
.
is_a?
(
Module
)
@backend
=
name
else
require
"active_support/json/backends/
#{
name
.
to_s
.
downcase
}
"
@backend
=
ActiveSupport
::
JSON
::
Backends
::
const_get
(
name
)
end
@parse_error
=
@backend
::
ParseError
def
engine
=
(
name
)
MultiJson
.
engine
=
name
end
alias
:backend
=
:engine
=
def
with_backend
(
name
)
old_backend
,
self
.
backend
=
backend
,
name
...
...
@@ -35,15 +34,30 @@ def with_backend(name)
self
.
backend
=
old_backend
end
def
set_default_backend
DECODERS
.
find
do
|
name
|
def
parse_error
MultiJson
::
DecodeError
end
private
def
convert_dates_from
(
data
)
case
data
when
nil
nil
when
DATE_REGEX
begin
self
.
backend
=
name
true
rescue
LoadError
# Try next decoder.
false
DateTime
.
parse
(
data
)
rescue
ArgumentError
data
end
when
Array
data
.
map!
{
|
d
|
convert_dates_from
(
d
)
}
when
Hash
data
.
each
do
|
key
,
value
|
data
[
key
]
=
convert_dates_from
(
value
)
end
else
data
end
end
end
...
...
activesupport/test/json/decoding_test.rb
浏览文件 @
011afb70
...
...
@@ -56,12 +56,9 @@ class TestJSONDecoding < ActiveSupport::TestCase
%q({"a":"Line1\u000aLine2"})
=>
{
"a"
=>
"Line1
\n
Line2"
}
}
# load the default JSON backend
ActiveSupport
::
JSON
.
backend
=
'Yaml'
backends
=
%w(Yaml)
backends
<<
"JSONGem"
if
defined?
(
::
JSON
)
backends
<<
"Yajl"
if
defined?
(
::
Yajl
)
backends
=
[
:ok_json
]
backends
<<
:json_gem
if
defined?
(
::
JSON
)
backends
<<
:yajl
if
defined?
(
::
Yajl
)
backends
.
each
do
|
backend
|
TESTS
.
each
do
|
json
,
expected
|
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录