我想排除以下JSON中没有 productModel 属性的商品。我们如何在Groovy中实现这一目标 我尝试使用 hasProperty ,但没有按预期工作。如果可以的话,我可以得到一些示例代码片段
我尝试了下面的代码-但没有按预期工作。
{Binding ElementName=pos, Path=ActualWidth, Mode=OneWay}
任何帮助将不胜感激。
response.getAt('myData').getAt('data').getAt('product').hasProperty('productModel').each { println "result ${it}" }
答案 0 :(得分:0)
如果要从JSON对象中排除特定字段,则必须使用过滤后的数据重新创建它。关键部分是这两行(假设下面示例中的json
变量将您的JSON存储为文本):
def root = new JsonSlurper().parseText(json)
def myData = root.myData.findAll { it.data.product.containsKey('productModel') }
这里发生的是我们访问root.myData
列表,并使用findAll(predicate)
方法对其进行过滤,在这种情况下,谓词说只有路径productModel
中具有键data.product
的对象被接受。该findAll()
方法不会使现有列表发生突变,这就是为什么我们将结果存储在变量myData
中的原因-运行此方法后,我们将得到一个大小为2的列表。
下一步,您必须重新创建要表示为JSON的对象:
def newJsonObject = [
myData: myData,
metadata: [
count: myData.size(),
offset: 0
]
]
println JsonOutput.prettyPrint(JsonOutput.toJson(newJsonObject))
在这一部分中,我们创建newJsonObject
,最后将其转换为JSON表示形式。
这是完整的示例:
import groovy.json.JsonOutput
import groovy.json.JsonSlurper
def json = '''{
"myData": [{
"data": {
"product": {
"productId": "apple",
"productName": "iPhone",
"productModel": "6s"
},
"statusCode": "active",
"date": "2018-08-07T00:00:00.000Z"
},
"links": [{
"productUrl": "test"
},
{
"productImage": "test"
}
],
"info": {}
},
{
"data": {
"product": {
"productId": "apple",
"productName": "iPhone",
"productModel": "7"
},
"statusCode": "active",
"date": "2018-08-07T00:00:00.000Z"
},
"links": [{
"productUrl": "test"
},
{
"productImage": "test"
}
],
"info": {}
},
{
"data": {
"product": {
"productId": "apple",
"productName": "Macbook"
},
"statusCode": "active",
"date": "2018-08-07T00:00:00.000Z"
},
"links": [{
"productUrl": "test"
},
{
"productImage": "test"
}
],
"info": {}
}
],
"metadata": {
"count": 3,
"offset": 0
}
}'''
def root = new JsonSlurper().parseText(json)
def myData = root.myData.findAll { it.data.product.containsKey('productModel') }
def newJsonObject = [
myData: myData,
metadata: [
count: myData.size(),
offset: 0
]
]
println JsonOutput.prettyPrint(JsonOutput.toJson(newJsonObject))
这是它产生的输出:
{
"myData": [
{
"data": {
"product": {
"productId": "apple",
"productName": "iPhone",
"productModel": "6s"
},
"statusCode": "active",
"date": "2018-08-07T00:00:00.000Z"
},
"links": [
{
"productUrl": "test"
},
{
"productImage": "test"
}
],
"info": {
}
},
{
"data": {
"product": {
"productId": "apple",
"productName": "iPhone",
"productModel": "7"
},
"statusCode": "active",
"date": "2018-08-07T00:00:00.000Z"
},
"links": [
{
"productUrl": "test"
},
{
"productImage": "test"
}
],
"info": {
}
}
],
"metadata": {
"count": 2,
"offset": 0
}
}