2016-09-26 60 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'和一個好的舊正則表達式。 –