簡體   English   中英

使用Groovy將bean序列化和反序列化為json

[英]Serialize & Deserialize bean to json with Groovy

我已經通過groovy http://www.infoq.com/news/2014/04/groovy-2.3-json閱讀了有關json的新聞。 所以我嘗試了本地方法來(de)序列化包含日期的groovy bean。 但我有問題,使用JsonOutput.toJson(對象)與JsonObject.fromObject()與java.util.Date

String jsonDat a= groovy.json.JsonOutput.toJson(contact)
Contact reloadContact = new Contact(net.sf.json.JSONObject.fromObject(jsonData))

在groovy 2.3+中使用原生方法的正確方法是什么?

否則,我可以去另一個像gson這樣的圖書館( http://www.mkyong.com/java/how-do-convert-java-object-to-from-json-format-gson-api/

package test

import groovy.json.JsonOutput
import net.sf.json.JSONObject

class JsonTest {

    public static void main(String[] args) {
        JsonTest test = new JsonTest()
        test.serialization()
    }

    public void serialization(){
        Contact contact = new Contact()
        contact.name = 'John'
        contact.registration = Date.parse('dd/MM/yyyy', '20/10/2011')

        String jsonData = JsonOutput.toJson(contact)
        println(jsonData)

        Object object = JSONObject.fromObject(jsonData)
        Contact reloadContact = new Contact(object)

        println(jsonData)
    }

    public class Contact{
        String name
        Date registration
    }
}

編輯:我也試過JsonSlurper,但總是得到GroovyCastException:無法將類'java.lang.String'的對象'2011-10-19T22:00:00 + 0000'轉換為類'java.util.Date'包測試

import groovy.json.JsonOutput
import groovy.json.JsonSlurper

class JsonTest {

    public static void main(String[] args) {
        JsonTest test = new JsonTest()
        test.serialization()
    }

    public void serialization(){
        Contact contact = new Contact()
        contact.name = 'John'
        contact.registration = Date.parse('dd/MM/yyyy', '20/10/2011')

        String jsonData = JsonOutput.toJson(contact)
        println(jsonData)

        JsonSlurper slurper = new JsonSlurper()
        def object = slurper.parseText(jsonData)
        Contact reloadContact = new Contact(object)

        println(jsonData)
    }

    public class Contact{
        String name
        Date registration
    }
}

解決方法

我找到了一個解決方法,但總體來說Json(de)序列化對日期非常混亂......

雖然http://groovy-lang.org/json.html聲明支持java.util.date但它依賴於“舊”RFC 822“yyyy-MM-dd'T'HH:mm:ssZ”,請參閱https: //docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html#timezone(Java 6.0及以下版本)

Java 7.0引入了ISO 8601支持“yyyy-MM-dd'T'HH:mm:ss.SSSXXX”

這個錯誤http://jira.codehaus.org/browse/GROOVY-6854仍然存在於Groovy 2.3.7中。 此外,默認情況下,默認的JsonSlurper不會轉換日期。 只有JsonParserLax和JsonFastParser似乎關心Date解析,因此您需要強制使用正確的Parser類型。

目前基於GROOVY-6854的解決方法:

public void serializationNative(){
    Contact contact = new Contact()
    contact.name = 'John'
    contact.registration = Date.parse('dd/MM/yyyy', '20/10/2011')

    def sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
    sdf.setTimeZone(TimeZone.getTimeZone('UTC'))
    JsonOutput.dateFormatter.set(sdf)
    String jsonData = JsonOutput.toJson(contact)
    println(jsonData)

    JsonSlurper slurper = new JsonSlurper().setType( JsonParserType.INDEX_OVERLAY )
    def object = slurper.parseText(jsonData)
    Contact reloadContact = new Contact(object)
}

我希望JSON的(反)序列化約定將在即將發布的版本中實施。

為了完整起見,我還嘗試了其他庫,這是我的其他測試:

福利

Boon 0.30在序列化Groovy對象(metaClass)時丟失,並為“檢測到的循環依賴”拋出org.boon.Exceptions $ SoftenedException

public void serializationBoon(){
    Contact contact = new Contact()
    contact.name = 'John'
    contact.registration = Date.parse('dd/MM/yyyy', '20/10/2011')

    ObjectMapper mapper = JsonFactory.create()

    String jsonData = mapper.toJson(contact)
    println(jsonData)

    Contact reloadContact = mapper.fromJson(jsonData, Contact.class)
}

GSON

GSON 2.3.1 作品外的即裝即用,但序列化到本地日期格式:{“名”:“約翰”,“登記”:“2011年10月20日12:00:00 AM”}

public void serializationGson(){
    Contact contact = new Contact()
    contact.name = 'John'
    contact.registration = Date.parse('dd/MM/yyyy', '20/10/2011')

    Gson gson = new Gson()

    String jsonData = gson.toJson(contact)
    println(jsonData)

    Contact reloadContact = gson.fromJson(jsonData, Contact.class)

    println(jsonData)
}

傑克遜

傑克遜2.4.4 作品外的即裝即用,但序列化為划時代毫秒格式:
{ “名”: “約翰”, “登記”:1319061600000}

public void serializationJackson(){
    Contact contact = new Contact()
    contact.name = 'John'
    contact.registration = Date.parse('dd/MM/yyyy', '20/10/2011')

    com.fasterxml.jackson.databind.ObjectMapper mapper = new com.fasterxml.jackson.databind.ObjectMapper();

    String jsonData = mapper.writeValueAsString(contact)
    println(jsonData)

    Contact reloadContact = mapper.readValue(jsonData, Contact.class)
}

解決方案很好。 只是想更新我使用groovy 2.4.5並且問題看起來是固定的。

Book b = new Book(isbn:'dfjkad',quantity: 6, price: 5.00, title: "our mork book",
        publishDate: Date.parse('dd/MM/yyyy', '20/10/2011'), publisher: "matt payne")
render JsonOutput.toJson(b)

輸出

{"publishDate":"2011-10-20T04:00:00+0000","title":"our mork book","publisher":"matt payne","isbn":"dfjkad","price":5.00,"quantity":6,"author":null}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM