如何将JSON字符串里面的某个字段的json字符串格式转成json对象?

news2024/11/15 7:01:30

目录标题

  • 背景
  • 临时方案
  • 最好的方案

背景

下游传过来的数据是一个json字符串,这个json字符串里面有的字段又套着json字符串!还有一些字段直接是null传过来的!现在要去掉null,且将一些json字符串!尽可能的换成json对象!

如下,content(json字符串)套着content(json字符串)

{
  "id": null,
  "type": null,
  "content": "{\"marketCardId\":null,\"name\":\"最后创建一下\",\"type\":null,\"guideWords\":null,\"cardTitle\":\"文本+链接试一下12\",\"rightsExplain\":[\"测试2\"],\"smsVerificationType\":0,\"contactInfo\":null,\"productInfo\":null,\"jumpUrlInfo\":\"https://weibo.com/at/weibo\",\"acqLinkId\":null,\"acqLinkName\":null,\"acqLinkGroupId\":null,\"acqLinkGroupName\":null,\"content\":\"{\\\"marketCardId\\\":null,\\\"name\\\":\\\"最后创建一下\\\",\\\"type\\\":null,\\\"guideWords\\\":null,\\\"cardTitle\\\":\\\"文本+链接试一下12\\\",\\\"rightsExplain\\\":[\\\"测试2\\\"],\\\"smsVerificationType\\\":0,\\\"contactInfo\\\":null,\\\"productInfo\\\":null,\\\"jumpUrlInfo\\\":\\\"https://weibo.com/at/weibo\\\",\\\"acqLinkId\\\":null,\\\"acqLinkName\\\":null,\\\"acqLinkGroupId\\\":null,\\\"acqLinkGroupName\\\":null,\\\"acqLinkType\\\":null,\\\"createTime\\\":null,\\\"cardSourceFrom\\\":0,\\\"headUrl\\\":null}\",\"createTime\":null,\"cardSourceFrom\":0,\"headUrl\":null}",
  "configAuditStatusEnum": null
}

临时方案

  • 使用com.alibaba.fastjson.JSONObject
  • 使用深度遍历
    @Test
    public void buildMvelScriptBusinessPrivateMsgAudit() {
        String content = "{\"id\":null,\"merchantId\":null,\"type\":null,\"content\":\"{\\\"marketCardId\\\":null,\\\"name\\\":\\\"最后创建一下\\\",\\\"type\\\":null,\\\"guideWords\\\":null,\\\"cardTitle\\\":\\\"文本+链接试一下12\\\",\\\"rightsExplain\\\":[\\\"测试2\\\"],\\\"smsVerificationType\\\":0,\\\"contactInfo\\\":null,\\\"productInfo\\\":null,\\\"jumpUrlInfo\\\":\\\"https://weibo.com/at/weibo\\\",\\\"acqLinkId\\\":null,\\\"acqLinkName\\\":null,\\\"acqLinkGroupId\\\":null,\\\"acqLinkGroupName\\\":null,\\\"content\\\":\\\"{\\\\\\\"marketCardId\\\\\\\":null,\\\\\\\"name\\\\\\\":\\\\\\\"最后创建一下\\\\\\\",\\\\\\\"type\\\\\\\":null,\\\\\\\"guideWords\\\\\\\":null,\\\\\\\"cardTitle\\\\\\\":\\\\\\\"文本+链接试一下12\\\\\\\",\\\\\\\"rightsExplain\\\\\\\":[\\\\\\\"测试2\\\\\\\"],\\\\\\\"smsVerificationType\\\\\\\":0,\\\\\\\"contactInfo\\\\\\\":null,\\\\\\\"productInfo\\\\\\\":null,\\\\\\\"jumpUrlInfo\\\\\\\":\\\\\\\"https://weibo.com/at/weibo\\\\\\\",\\\\\\\"acqLinkId\\\\\\\":null,\\\\\\\"acqLinkName\\\\\\\":null,\\\\\\\"acqLinkGroupId\\\\\\\":null,\\\\\\\"acqLinkGroupName\\\\\\\":null,\\\\\\\"acqLinkType\\\\\\\":null,\\\\\\\"createTime\\\\\\\":null,\\\\\\\"cardSourceFrom\\\\\\\":0,\\\\\\\"headUrl\\\\\\\":null}\\\",\\\"createTime\\\":null,\\\"cardSourceFrom\\\":0,\\\"headUrl\\\":null}\",\"extendUnitList\":[{\"id\":null,\"merchantId\":null,\"type\":null,\"content\":\"{\\\"id\\\":null,\\\"switchStatus\\\":null,\\\"type\\\":null,\\\"questionTitle\\\":null,\\\"content\\\":\\\"\\\"}\",\"isDel\":null,\"createTime\":null,\"updateTime\":null}],\"auditSeqId\":null,\"configAuditStatusEnum\":null}";

        Set<String> jsonKeys = new HashSet<>(Arrays.asList("content"));
        Map<String, Object> jsonMap = transformJson(content, jsonKeys);
        System.out.println("jsonMap=" + JSONObject.toJSONString(jsonMap));
    }

    /***
     * 1.将JSON字符串里面的某个字段null剔除
     * 2.将JSON字符串里面的某个字段的json字符串格式转成json对象
     * @param content
     * @return
     */
    private Map<String, Object> transformJson(String content, Set<String> jsonKeys) {
        Map<String, Object> contentMapNew = new HashMap<>();
        if (JSONObject.isValid(content)) {
            Map<String, Object> contentMap = JSONObject.parseObject(content, HashMap.class);
            contentMap = contentMap.entrySet().stream()
                    .filter(entry -> Objects.nonNull(entry.getValue()))
                    .filter(entry -> !Objects.equals("null", entry.getValue()))
                    .collect(Collectors.toMap(
                            Map.Entry::getKey,
                            Map.Entry::getValue,
                            (oldValue, newValue) -> oldValue,
                            HashMap::new));
            for (Entry<String, Object> entry : contentMap.entrySet()) {
                if (jsonKeys.contains(entry.getKey())
                        && entry.getValue() instanceof String
                        && JSONObject.isValid((String) entry.getValue())) {
                    contentMapNew.put(entry.getKey(), transformJson((String) entry.getValue(), jsonKeys));
                } else {
                    contentMapNew.put(entry.getKey(), entry.getValue());
                }
            }
        }
        return contentMapNew;
    }

感兴趣的同学还可以扩展!这里只是一个简单思路!

最好的方案

让上游给传正确的格式!!!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2124005.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UE4_后期处理_后期处理材质及后期处理体积一

后期处理效果 在渲染之前应用于整个渲染场景的效果。 后期处理效果&#xff08;Post-processing effect&#xff09;使美术师和设计师能够对影响颜色、色调映射、光照的属性和功能进行组合选择&#xff0c;从而定义场景的整体外观。要访问这些功能&#xff0c;可以将一种称为…

[转]什么是工作流,flowable 与 Activiti对比

工作流 什么是工作流工作流是复杂版本的状态机Java工作流开源框架工作流对比 Activiti 设计器Flowable 兼容性Camunda 设计器兼容性&#xff1a;小结&#xff1a;社区活跃度 FlowableActivitiCamunda总结 什么是工作流 工作流&#xff0c;是指“业务​过程的部分或整体在​计算…

面试题:try和finally中都出现了return语句会发生什么情况

答&#xff1a;会导致提前返回&#xff0c;即执行finally中的return语句&#xff0c;try中的return语句不会被执行。 原因&#xff1a;当try中有return语句时&#xff0c;会延迟返回&#xff0c;即先执行完finally的代码&#xff0c;再执行try的return语句&#xff0c;这样做的…

在windows下抓空包(monitor网卡+wareshark+MNM)

当我们的电脑是通过网线联网时&#xff0c;我们可以通过wareshark来抓取通过网口发送和接收到的包&#xff0c;其中包括单播包、多播包以及广播包等等&#xff0c;只要这个包是通过目标网口的。 但是&#xff0c;如果是无线包呢&#xff1f;我们的无线包其实也是通过无线网卡来…

多目标优化及其MATLAB实现

目录 引言 多目标优化的数学模型 非劣解与Pareto前沿 多目标优化求解方法 MATLAB多目标优化工具 多目标规划中的重要概念 表格总结&#xff1a;常见多目标优化方法及其特点 MATLAB在多目标优化中的应用 结论 引言 多目标优化问题在实际应用中非常常见&#xff0c;因为…

ai学习(2)分词、分词算法、加入注意力机制的Seq2Seq结构模型(编码器、解码器、注意力机制)、日期转换实战代码

文章目录 参考书《多模态大模型&#xff1a;算法、应用与微调》1.分词2.分词算法主流的三种分词算法&#xff0c;BPE分词算法&#xff08;GPT-2、BART、Llama模型&#xff09;、WordPiece分词算法&#xff08;BERT模型&#xff09;、SentencePiece分词算法&#xff08;ChatGLM、…

Linux常见指令、ls、pwd、cd、touch、mkdir、rmdir、rm等的介绍

文章目录 前言一、ls二、pwd三、cd四、touch五、 mkdir六、rmdir七、rm总结 前言 Linux常见指令、ls、pwd、cd、touch、mkdir、rmdir、rm等的介绍 一、ls 列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息 -a 列出目录下的所有文件&#xff0c;…

蓝鹏测控更换新滑台供应商,实现数据平稳性显著提升

近日&#xff0c;蓝鹏测控技术有限公司宣布了一项重要的供应链优化举措——成功更换了其核心设备——滑台的供应商。这一变革不仅优化了公司的生产流程&#xff0c;还显著提升了产品的数据平稳性&#xff0c;达到了惊人的5%提升&#xff0c;标志着蓝鹏测控在提升产品质量与性能…

代码随想录算法训练营第五十三天 | 110.字符串接龙 ,105.有向图的完全可达性 ,106.岛屿的周长

目录 110.字符串接龙 思路 方法一&#xff1a; 广搜 105.有向图的完全可达性 思路 1.确认递归函数&#xff0c;参数 2.确认终止条件 3.处理目前搜索节点出发的路径 方法一&#xff1a;广搜 106.岛屿的周长 思路 解法一&#xff1a; 解法二&#xff1a; 方法一 …

Python | Leetcode Python题解之第398题随机数索引

题目&#xff1a; 题解&#xff1a; class Solution:def __init__(self, nums: List[int]):self.nums numsdef pick(self, target: int) -> int:ans cnt 0for i, num in enumerate(self.nums):if num target:cnt 1 # 第 cnt 次遇到 targetif randrange(cnt) 0:ans …

15 三数之和

解题思路&#xff1a; \qquad 要找到所有和为0的三元组&#xff0c;使用暴力去解的话时间复杂度为 O ( N 3 ) O(N^3) O(N3)&#xff0c;但是这样会超时。若三数之和为0&#xff0c;那么只要知道其中的两个&#xff0c;就可以知道第三个数的值。进而可以想到用map这样的数据结…

Patch 35586779: WLS PATCH SET UPDATE 10.3.6.0.231017

以上补丁请自行去oracle官网下载&#xff0c;需要技术支持的请联系&#xff1a;https://item.taobao.com/item.htm?spm2013.1.w4023-17257245948.4.19611db9bzrKBx&id608692494369

C语言 | Leetcode C语言题解之第397题整数替换

题目&#xff1a; 题解&#xff1a; //第一种动态规划:超时 // class Solution { // public: // int integerReplacement(int n) { // vector<int>dp(n1,0); // dp[1]0; // for(int i2;i<n;i){ // if(i%20){ // …

Ubuntu查看系统用户信息

0 Preface/Foreword 1 查看方式 1.1 查看系统用户 getent passwd getent: Get entries for Name Service Switch Libraries. 该命令会列出系统上所有用户的详细信息&#xff0c;包括用户名、密码、用户ID&#xff08;UID&#xff09;、组ID&#xff08;GID&#xff09;、用户描…

Python用MarkovRNN马尔可夫递归神经网络建模序列数据t-SNE可视化研究

原文链接&#xff1a;https://tecdat.cn/?p37634 本文聚焦于利用马尔可夫递归神经网络&#xff08;MarkovRNN&#xff09;结合树库展开建模工作。MarkovRNN 通过整合马尔可夫特性与离散随机变量来深入探索递归神经网络中的随机转换机制&#xff0c;旨在高效处理具有复杂潜在信…

轻量级模型解读——GhostNet系列

GhostNet由华为诺亚方舟实验室于2019年11月底提出&#xff0c;投稿于cvpr2020&#xff0c;后面2022年&#xff0c;2024年相继提出更新版本GhostNetv2和GhostNetv3。 它们参数量、复杂度及ImageNet的top1结果对比情况如下&#xff1a; 文章目录 1、GhostNetv11.1 Ghost Module1…

如何阅读李冬梅老师《数据结构》

根据《如何阅读一本书》第五章&#xff1a;主动阅读的基础&#xff1a;阅读者要提出的4个基本问题&#xff1f; 以第2章&#xff0c;线性表为例&#xff1a; &#xff08;1&#xff09;本章主要在谈些什么&#xff1f;例如第二章简介&#xff0c;读完这一章可以自己试着写个简…

基于STM32设计的18650锂电池电量(电压/电流)检测系统——采用电阻分压法、均值滤波及ADC测量—文末工程资料下载

基于STM32设计的锂电池电量&#xff08;电压/电流&#xff09;检测 前言&#xff1a;使用STM32F103C8T6的ADC&#xff0c;和电阻分压法及均值滤波来测量18650锂电池的电压&#xff0c;并在OLED显示屏上显示电池电压值&#xff0c;求出电池电压值即求出电池的电流值和电量值。本…

数据库系统概论笔记(持续更新)

一、概念 1、数据 数据库中存储的基本对象。 2、数据库 定义&#xff1a;长期存储在计算机内、有组织、可共享的大量数据的集合。 3、数据库管理系统 定义&#xff1a;是位于用户与操作系统之间的一层数据管理软件。 主要功能&#xff1a; 1&#xff09; 数据定义功能 …

C++ | Leetcode C++题解之第395题至少有K个重复字符的最长子串

题目&#xff1a; 题解&#xff1a; class Solution { public:int longestSubstring(string s, int k) {int ret 0;int n s.length();for (int t 1; t < 26; t) {int l 0, r 0;vector<int> cnt(26, 0);int tot 0;int less 0;while (r < n) {cnt[s[r] - a];…