2016-09-26 61 views
0

我试图将data.table对象转换为JSON。具有numeric值的列应以“统一”方式转换为JSON值,即所有值都应包含小数部分,即使其值为“.0”。我所拥有的是:将数值统一转换为JSON

library(RJSONIO) 
test <- data.table(V1 = c(1.0, 2.0, 4.5, 3.0)) 
cat(toJSON(test)) 

{ 
    "V1": [ 1, 2, 4.5, 3 ] 
} 

然而,我想要做的是得到以下的输出:

{ 
    "V1": [ 1.0, 2.0, 4.5, 3.0 ] 
} 

我与其他库如rjson试图和我得到的相同的结果。我似乎无法找到任何控制此问题的选项。我最后的选择是手动处理输出JSON字符串,最后添加所需的“.0”,但我想知道是否有更好的选择。任何帮助将不胜感激。

+0

你为什么要这样做?在解析时,我猜JSON中的'1'和'1.0'不会产生任何区别。 – nicola

+0

@nicola因为我想把JSON放到Elasticsearch中(使用'elastic'库),如果数组没有相同的“格式”中的数字,Elasticsearch不断让我恼人的“mapper [V1]不同类型,current_type [long],merged_type [double]“ –

回答

1

jsonlite有一个always_decimal选项为此:

> test <- data.table(V1 = c(1.0, 2.0, 4.5, 3.0)) 
> test 
    V1 
1: 1.0 
2: 2.0 
3: 4.5 
4: 3.0 
> jsonlite::toJSON(test, dataframe="columns", always_decimal=TRUE) 
{"V1":[1.0,2.0,4.5,3.0]} 

它似乎并没有严格“始终”:

> test$V2 = 1:4 
> jsonlite::toJSON(test, dataframe="columns", always_decimal=TRUE) 
{"V1":[1.0,2.0,4.5,3.0],"V2":[1,2,3,4]} 

,但它看起来像它做列类型的一些检查:

> test$V3 = c(1,2,3,4.0) 
> jsonlite::toJSON(test, dataframe="columns", always_decimal=TRUE) 
{"V1":[1.0,2.0,4.5,3.0],"V2":[1,2,3,4],"V3":[1.0,2.0,3.0,4.0]} 

并做小数的“数字“而不是”整数“列。

+0

太棒了!我没有注意那个图书馆。非常感谢。 –

1

下面的代码不正是你想要使用格式指定的小数号码是什么:

 library(RJSONIO) 
    library(data.table) 

    test <- data.table(V1 = c(1.0, 2.0, 4.5, 3.0)) 
    test$V1 <- format(round(test$V1, 2)) 
    cat(toJSON(test)) 

结果:

{ 
"V1": [ "1.0", "2.0", "4.5", "3.0" ] 
} 
+0

非常感谢。 –

+0

除了将数字转换为带引号的字符串值。如果目标是将这些数据作为数字提供给ElasticSearch,则可能需要其他一些消息。 – Spacedman

+0

谢谢@Spacedman,我想我必须使用'gsub'和一个好的旧正则表达式。 –