首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较两个json对象和从第二个json对象中删除空值。

比较两个json对象和从第二个json对象中删除空值。
EN

Stack Overflow用户
提问于 2022-09-24 19:49:43
回答 1查看 70关注 0票数 0

我想比较两个对象,并将它们与补丁json数据合并。如果修补程序对象中的值为null,则比较有效负载和修补程序,并从有效负载中删除字段。

输入:

代码语言:javascript
复制
{
 "firstname":"John",
 "lastname":"Sam",
 "city": "San Jose",
 "path": "additional",
 "location-1": {
   "address": "USA",
   "pin": null
  },
  "location-2": {
   "address": null,
   "place": "abc",
   "pin": null
  }
}

数据编织代码:

代码语言:javascript
复制
%dw 2.0
output application/json 
import mergeWith from dw::core::Objects

var patch = {
    lastname:"Courtney",
    age:"18",
    path: "",
    company: "MR",
    firstname: null,
    city: null,
  "location-1": {
    "address": "USA",
    "pin": null
    }
  }
---
(payload mergeWith ((patch)) filterObject ($ != null ))

预期输出:

代码语言:javascript
复制
{  
  "lastname": "Courtney",
  "age": "18",
  "path": "",
  "company": "MR",
  "location-1": {
    "address": "USA"
   },
   "location-2": {
    "address": null,
    "place": "abc",
    "pin": null
  }
}

但是,我无法从输出中的Loce-1对象中删除空值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-25 02:41:26

如果我正确理解了请求,那么您可以使用filterObject()来删除需要删除的元素,使用mapObject()来递归地将筛选应用于子对象。递归函数removeMergedNull()实现了这个逻辑。

我编写了在函数filterObject()中保留用于shouldRemove() ()的元素的条件。

然后我就把它应用到你剧本的结果上。

代码语言:javascript
复制
%dw 2.0
output application/json 
import mergeWith from dw::core::Objects

var patch = {
    lastname:"Courtney",
    age:"18",
    path: "",
    company: "MR",
    firstname: null,
    city: null,
  "location-1": {
    "address": "USA",
    "pin": null
    }
  }

fun shouldRemove(x,key, p)=(p == null) or !(keysOf(p) contains (key) as String) and !(p[key as String] == null)        

fun removeMergedNull(o, p)=
    o 
        filterObject ((value, key, index) -> value  match {
                case x is String -> shouldRemove(x, key, p)
                case x is Null -> shouldRemove(x, key, p)         
                else -> true
        })
        mapObject ((value, key, index) -> value  match {
            case child is Object -> (key): removeMergedNull(child,  p[key as String])
            else -> (key):value
    }) 
---
removeMergedNull((payload mergeWith ((patch)) filterObject ($ != null )), patch)

输出:

代码语言:javascript
复制
{
  "location-2": {
    "address": null,
    "place": "abc",
    "pin": null
  },
  "lastname": "Courtney",
  "age": "18",
  "path": "",
  "company": "MR",
  "location-1": {
    "address": "USA"
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73840177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档