有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在Groovy中实现ObjectJSON映射的标准方法是什么?

在Java中,如果我想将一些JSON转换为POJO(反之亦然),我将使用Gson甚至FlexJson在某种mapper对象中为我进行转换:

public interface JsonMapper<T> {
    public T toPojo(String json);
    public String toJson(T pojo);
}

public class WidgetJsonMapper implements JsonMappper<Widget> {
    private Gson mapper;

    @Override
    public Widget toPojo(String json) {
        // Use mapper to deserialize JSON into POJO
    }

    @Override
    public String toJson(Widget pojo) {
        // Use mapper to serialize a Widget instance into a JSON string.
    }
}

等等。我想知道当我们谈论Groovy时,游戏是如何变化的。我看到Grooovy有一个内置的JsonSlurper,我想知道是否可以用它来代替JSON映射框架(比如Gson)


共 (1) 个答案

  1. # 1 楼答案

    Gson还可以在Groovy中用于将JSON解析为POGO,反之亦然。JsonSlurper和JsonBuilder也同样适用。下面是一个使用两种方法的示例:

    @Grab( 'com.google.code.gson:gson:2.8.0' )
    import com.google.gson.Gson
    import com.google.gson.GsonBuilder
    import groovy.json.JsonSlurper
    import groovy.json.JsonBuilder
    
    class Book {
        String name
        int isbn
        List<Author> authors
    }
    
    class Author {
        String name
        int age
    }
    
    def jsonString = '''
    {
        "name": "Groovy", 
        "isbn": 12345, 
        "authors": [{
            "name": "John Doe", 
            "age": 30
         }, {
            "name": "Bill Nash", 
            "age": 40
         }] 
    }
    '''
    
    //To Test
    void assertions( book ) {
      book.with {
        assert name == 'Groovy'
        assert isbn == 12345
        assert authors
        assert authors[0].name == 'John Doe'
        assert authors[0].age == 30
        assert authors[1].name == 'Bill Nash'
        assert authors[1].age == 40
      }
    }
    
    /* JSON To POGO*/
    //Using JsonSlurper
    def book = new Book( new JsonSlurper().parseText( jsonString ) )
    assertions book
    
    //Using GSON
    Gson gson = new Gson()
    def bookUsingGson = gson.fromJson( jsonString, Book )
    assertions bookUsingGson 
    
    /* POGO To JSON */
    //Using JsonBuilder
    println new JsonBuilder( book ).toPrettyString()
    
    //Using Gson
    println gson.toJson( bookUsingGson )
    
    //Using GsonBuilder for customization
    GsonBuilder builder = new GsonBuilder()
    
    // enable pretty print and seriliaze nulls
    builder.setPrettyPrinting().serializeNulls()
    
    // customize field title
    builder.fieldNamingStrategy = { field -> field.name == "name" ? "title" : field.name }
    
    // use the GsonBuilder to create a gson
    Gson gsonBuilder = builder.create()
    
    // pretty print
    println gsonBuilder.toJson( bookUsingGson )