如何使用Groovy从JSON中排除特定字段

时间:2018-08-07 16:53:27

标签: json groovy

我想排除以下JSON中没有 productModel 属性的商品。我们如何在Groovy中实现这一目标 我尝试使用 hasProperty ,但没有按预期工作。如果可以的话,我可以得到一些示例代码片段

我尝试了下面的代码-但没有按预期工作。

{Binding ElementName=pos, Path=ActualWidth, Mode=OneWay}

任何帮助将不胜感激。

response.getAt('myData').getAt('data').getAt('product').hasProperty('productModel').each { println "result ${it}" }

1 个答案:

答案 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
    }
}