更新 JSON 字符串中的值

Posted

技术标签:

【中文标题】更新 JSON 字符串中的值【英文标题】:Update value in a JSON String 【发布时间】:2021-12-10 07:36:20 【问题描述】:

这与我之前的帖子有关:Link to Previous Post

在 SQL 表的列中有这个 JSON 字符串:

看到完整的 JSON 字符串:

DECLARE @json NVARCHAR(MAX)
SET @json=
'
"status":"ok",
"data":
  "response":
     "GetCustomReportResult":
        "CIP":null,
        "CIQ":null,
        "Company":null,
        "ContractOverview":null,
        "ContractSummary":null,
        "Contracts":null,
        "CurrentRelations":null,
        "Dashboard":null,
        "Disputes":null,
        "DrivingLicense":null,
        "Individual":null,
        "Inquiries":
           "InquiryList":null,
           "Summary":
              "NumberOfInquiriesLast12Months":0,
              "NumberOfInquiriesLast1Month":0,
              "NumberOfInquiriesLast24Months":0,
              "NumberOfInquiriesLast3Months":0,
              "NumberOfInquiriesLast6Months":0
           
        ,
        "Managers":null,
        "Parameters":
           "Consent":True,
           "IDNumber":"124",
           "IDNumberType":"TaxNumber",
           "InquiryReason":"reditTerms",
           "InquiryReasonText":null,
           "ReportDate":"2021-10-04 06:27:51",
           "Sections":
              "string":[
                 "infoReport"
              ]
           ,
           "SubjectType":"Individual"
        ,
        "PaymentIncidentList":null,
        "PolicyRulesCheck":null,
        "ReportInfo":
           "Created":"2021-10-04 06:27:51",
           "ReferenceNumber":"60600749",
           "ReportStatus":"SubjectNotFound",
           "RequestedBy":"Jir",
           "Subscriber":"Credit",
           "Version":544
        ,
        "Shareholders":null,
        "SubjectInfoHistory":null,
        "TaxRegistration":null,
        "Utilities":null
     
  
 ,
 "errormsg":null
 '
 SELECT * FROM OPENJSON(@json);

我想更新 Consent 元素的值,在 value 周围加上引号“”,因为 JSON 很敏感并会导致错误。 Consent 元素位于 data.response.GetCustomReportResult.Parameters.Consent

然后我只想将更新后的 JSON 字符串列放入此代码中。大概可以用CTE或者子查询来实现?

    SELECT 
    y.cijreport,
    y.ApplicationId,
    x.CIP,
    x.CIQ
    --other fields
   FROM myTable as y
   CROSS APPLY OPENJSON (updated_cijreport, '$.data.response')
   WITH (
   CIP nvarchar(max) AS JSON,
   CIQ nvarchar(max) AS JSON
   ) AS x;

【问题讨论】:

【参考方案1】:

您必须更新列中的值,这应该是原子的。使用 Json 作为值不是关系。

无论如何,您可以像 Charlieface 所说的那样在字符串中进行替换,因为 json 只是 SQL Server 的 varchar。

【讨论】:

【参考方案2】:

您可以使用嵌套的 REPLACE 函数(用于 TRUE 和 FALSE)来更新列,以便引用 VALUE 字符串。 UPDATE 后 ISJSON 函数返回 1 表示 JSON 有效。

DECLARE @json       table(ApplicationId varchar(20),
                          cijreport     NVARCHAR(MAX));
insert @json(ApplicationId, cijreport) values
('C3272473021100', N'
"status":"ok",
"data":
  "response":
     "GetCustomReportResult":
        "CIP":null,
        "CIQ":null,
        "Company":null,
        "ContractOverview":null,
        "ContractSummary":null,
        "Contracts":null,
        "CurrentRelations":null,
        "Dashboard":null,
        "Disputes":null,
        "DrivingLicense":null,
        "Individual":null,
        "Inquiries":
           "InquiryList":null,
           "Summary":
              "NumberOfInquiriesLast12Months":0,
              "NumberOfInquiriesLast1Month":0,
              "NumberOfInquiriesLast24Months":0,
              "NumberOfInquiriesLast3Months":0,
              "NumberOfInquiriesLast6Months":0
           
        ,
        "Managers":null,
        "Parameters":
           "Consent":True,
           "IDNumber":"124",
           "IDNumberType":"TaxNumber",
           "InquiryReason":"reditTerms",
           "InquiryReasonText":null,
           "ReportDate":"2021-10-04 06:27:51",
           "Sections":
              "string":[
                 "infoReport"
              ]
           ,
           "SubjectType":"Individual"
        ,
        "PaymentIncidentList":null,
        "PolicyRulesCheck":null,
        "ReportInfo":
           "Created":"2021-10-04 06:27:51",
           "ReferenceNumber":"60600749",
           "ReportStatus":"SubjectNotFound",
           "RequestedBy":"Jir",
           "Subscriber":"Credit",
           "Version":544
        ,
        "Shareholders":null,
        "SubjectInfoHistory":null,
        "TaxRegistration":null,
        "Utilities":null
     
  
 ,
 "errormsg":null
 ');

update @json
set cijreport=replace(replace(cijreport, '"Consent":False', '"Consent":"False"'),
                                         '"Consent":True', '"Consent":"True"')
where ApplicationId='C3272473021100';

select isjson(cijreport) is_valid_json from @json;
is_valid_json
1

【讨论】:

以上是关于更新 JSON 字符串中的值的主要内容,如果未能解决你的问题,请参考以下文章

将文本字段更新为 JSON 字符串 - Javascript/JQuery [重复]

从 JSON 字符串中删除所有缩进和空格,除了它在 Ruby 中的值之外

解析复杂的JSON字符串以读取C#中的值

TypeError:在Python中过滤JSON中的值时,字符串索引必须为整数

java获取json格式中的值

从onClickListerner访问现有的json对象