首页 文章

Groovy JsonSlurper和带(子)对象的 Map

提问于
浏览
0

我正在试图整理和解组一个时髦的 beans 子 . 我稍后在Java中使用该功能 . 我的想法是使用JsonOutput编组对象并使用JsonSlurper解组它 . 我的bean包含一个子对象的映射 .

问题是,JsonSlurper将 Map 的值解组为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?

此致,托马斯

1 回答

  • 0

    Jackson 的诀窍和工作可靠......

    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()
            }
        }
    }
    

相关问题