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

标签 java json groovy

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

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)。

最佳答案

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 )

关于java - 在 Groovy 中实现 Object-JSON 映射的标准方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23531071/

相关文章:

arrays - Angular 5,来自 API 的 JSON 数组

grails - 在表格 Groovy 上循环显示两个相同大小的数组

groovy - 如何从 Groovy 设置 JIRA 票证的版本字段

java - 尝试从 pdf 中提取字形 ID 时缺少一些字形 ID

Java 日期验证问题

Java 过滤器列表仅包含不同的(比较器不会为任何值对返回 null)值

java - 为什么这个线程允​​许另一个线程访问它的同步方法?

jquery - Jquery JSON解析错误

c# - 类似于 GSON 的 Json.NET 松散类型选项

Groovy:在运行时检查对象是否为字符串