2017-02-24 41 views
0

我正在嘗試編組和解組一個groovy bean。我稍後在Java中使用這些功能。這個想法是我使用JsonOutput編組對象並用JsonSlurper解組。我的bean包含一個子對象的映射。Groovy JsonSlurper和帶有(子)對象的地圖

問題是,JsonSlurper將映射的值解組到LazyMap而不是原始對象。如果我直接包含對象的解組工作。

這裏我在做什麼的例子...

import java.util.Map 

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

class ClassA { 

    ClassB subClass 

    Map<String, ClassB> subClasses = [:] 

    static def ClassA build(String json){ 
     new JsonSlurper().parseText(json) 
    } 

    def String toString() { 
     JsonOutput.toJson(this) 
    } 
} 

...和ClassB ...

import groovy.json.JsonOutput 

class ClassB { 

    String message = [:] 

    def String toString() { 
     JsonOutput.toJson(this) 
    } 
} 

...這裏失敗的Java代碼...

ClassA classA = new ClassA(); 
ClassB classB = new ClassB(); 
classB.setMessage("Hello World!"); 
classA.setSubClass(classB); 
classA.getSubClasses().put("First", classB); 

System.out.println(ClassA.build(classA.toString()).getSubClass().getMessage()); 
System.out.println(ClassA.build(classA.toString()).getSubClasses().get("First").getMessage()); 

...倒數第二行輸出 「Hello World!」,如預期但最後一行失敗...

java.lang.ClassCastException: groovy.json.internal.LazyMap cannot be cast to ClassB 

是否有一個(更好的)方法來將常規對象編組和解組爲json?

問候, 托馬斯

回答

0

傑克遜的伎倆和工作可靠...

ClassA的

import com.fasterxml.jackson.databind.ObjectMapper 

class ClassA { 

    ClassB subClass 

    Map<String, ClassB> subClasses = [:] 

    static def ClassA build(String json){ 
     new ObjectMapper().readValue(json, ClassA.class) 
    } 

    def String toString() { 
     StringWriter writer = new StringWriter() 
     try { 
      new ObjectMapper().writeValue(writer, this) 
      return writer.toString() 
     } 
     finally { 
      writer.close() 
     } 
    } 
} 

和ClassB

import com.fasterxml.jackson.databind.ObjectMapper 

class ClassB { 

    String message = [:] 

    def String toString() { 
     StringWriter writer = new StringWriter() 
     try { 
      new ObjectMapper().writeValue(writer, this) 
      return writer.toString() 
     } 
     finally { 
      writer.close() 
     } 
    } 
}