1

我在输入JsonSlurperGroovy 时遇到了一些麻烦。我对 Groovy 还很陌生,甚至在向它添加强类型方面也很新——请耐心等待。

现在我已经创建了一个trait定义我的 JSON 对象的一般形状的,我正在尝试将结果parseText转换为它。

import groovy.json.JsonSlurper

trait Person {
    String firstname
    String lastname
}

def person = (Person)(new JsonSlurper().parseText('{"firstname": "Lando", "lastname": "Calrissian"}'))

println person.lastname

这抛出

Exception in thread "main" org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '{firstname=Lando, lastname=Calrissian}' with class 'org.apache.groovy.json.internal.LazyMap' to class 'Person' due to: groovy.lang.GroovyRuntimeException: Could not find matching constructor for: Person(org.apache.groovy.json.internal.LazyMap)
    ...

我可以看到为什么我的代码没有意义,我不是试图更改数据的类型(转换),我只是想让我的 IDE 知道这是我的对象内部的内容。

是否可以至少向我的 JSON 对象添加代码完成? 我也很想进行运行时类型检查,但这不是必需的。

4

2 回答 2

3

你可以尝试使用委托

这允许围绕地图包装类

import groovy.json.JsonSlurper

class Person {
    @Delegate Map delegate
    String getFirstname(){ delegate.get('firstname') }
    String getLastname(){ delegate.get('lastname') }
}

def person = new Person(delegate:new JsonSlurper().parseText('{"firstname": "Lando", "lastname": "Calrissian"}'))

println person.lastname

或者例如使用 Gson 进行解析:

@Grab(group='com.google.code.gson', module='gson', version='2.8.5')

import com.google.gson.Gson

class Person {
    String firstname
    String lastname
}

def person = new Gson().fromJson('{"firstname": "Lando", "lastname": "Calrissian"}', Person.class)

assert person instanceof Person
println person.lastname
于 2019-07-23T09:59:24.557 回答
1

这实际上一个演员表,Groovy 会尝试将您的 Map 转换为所述对象。

文档

强制运算符 (as) 是强制转换的一种变体。强制将对象从一种类型转换为另一种类型,但它们不兼容赋值。

这适用于 POJO 的方式是使用 Map-c'tor 构造一个新对象。这将展开为调用设置器或直接与静态编译一起使用。

请注意,使用带有多余键的映射会导致错误。所以我只会将它用于玩具项目。改用像杰克逊这样的适当的 JSON 映射器。

所以这里的解决方案是不使用特征(基本上是一个接口),而是使用常规类。

于 2019-07-23T05:00:14.467 回答