2012-10-25 67 views
15

我有一個場景。JSON到JSON變壓器

需要的輸入和輸出是JSON。

// Input 
{ 
    "OldObject": { 
    "Time": 1351160457922, 
    "Name": "OName", 
    "quantity": 100, 
    "price": 10 
    } 
} 


// Output 
{ 
    "NewObject": { 
    "Time": 1351160457922, 
    "Title": "OName", 
    "quantity": 100 
    } 
} 

我需要一些轉換代碼或最好是xslt類型的語言來將json從一種格式轉換爲另一種格式。這個變壓器也需要很快,因爲變換將在飛行中完成。

編輯
我沒有輸入對象的定義,接收並可能在運行時更改。但如果需要,我可以使用OUTPUT對象的類。 我試圖做到這一點,作爲json - > xml - > xslt - > xml - > json,但在這一端每秒接收大約1000個對象,並且此過程可能會產生開銷。
我也不能使用JavaScript,因爲myApp很簡單基於windows的java應用程序並且使用JavaScript可能會導致開銷。

+0

是的當然,我可以使用JavaScript。但更優選xslt類型的語言和變壓器處理器 –

+3

JSON補丁怎麼樣? http://tools.ietf.org/html/draft-pbryan-json-patch-00 –

+1

你可以找到它的實現,例如:https://github.com/bruth/jsonpatch-js –

回答

4

您可以使用ZORBA和JsonIQ http://www.jsoniq.org/ 但是,它是一個本地庫,它帶有一個包裝,因此您可以在java中使用它。

+0

稍後再看看我的包裝,可能會有所幫助:https://github.com/mvallebr/ZorbaJavaWrapper – mvallebr

9

您可以使用JSON patch進行此轉換。

例與jsonpatch-js

var transformations = [ 
    { move: '/OldObject', to: '/NewObject' }, 
    { remove: '/NewObject/price' }, 
    { move: '/NewObject/Name', to: '/NewObject/Title' } 
]; 

var oldObject = { "OldObject": { "Time": 1351160457922, "Name": "OName", "quantity": 100, "price": 10 } }; 

jsonpatch.apply(oldObject, transformations); 

我沒有測試這一點,但應該像這樣工作。

+0

有一點擔心 - 這樣做是否足夠好,因爲這個Javascript必須每秒修補大約1000個JSON對象? –

+0

這取決於你的情況。如果你想在服務器端做到這一點,你可以有不同的語言實現。我發佈了這個,因爲在你的問題中有一個JavaScript標籤。 –

+0

我使用java,它將是基於Windows的桌面應用程序。 –

14

嘗試JOLT。這是用Java編寫的JSON轉換庫的JSON。它是在一個項目上創建的,該項目將很多JSON從ElasticSearch「後端」轉換爲前端API。

對於JSON改變你在你的問題已經上市,重拳出擊 「轉變」 規範是:

// Jolt "shift" spec 
{ 
    "OldObject": { 
     "Time": "NewObject.Time", 
     "Name": "NewObject.Title", // if the input has "OldObject.Name", copy it's value 
            // to "NewObject.Title 
     "quantity": "NewObject.quantity" 
    } 
} 
0

您可以嘗試Java庫Silencio,可以讓你將JSON文件的每個節點轉換爲新值。您可以決定應該轉換哪些節點和節點。

0

另一種選擇是使用Logz.io Sawmill庫。您定義一個管道並執行它。舉例來說:

{ 
    steps: [ 
    { 
     rename { 
     config { 
      from: "OldObject" 
      to: "NewObject" 
     } 
     } 
    } 

    { 
     removeField { 
     config { 
      path: "NewObject.price" 
     } 
     } 
    } 

    { 
     rename { 
     config { 
      from: "NewObject.Name" 
      to: "NewObject.Title" 
     } 
     } 
    } 
    ] 
}