- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的想法来自 this answer并得到进一步的问题。我定义了一个变量:
declare @json nvarchar(max)
set @json =
N'{
"Book":{
"IssueDate":"02-15-2019"
, "Detail":{
"Type":"Any Type"
, "Author":{
"Name":"Annie"
, "Sex":"Female"
}
}
, "Chapter":[
{
"Section":"1.1"
, "Title":"Hello world."
}
,
{
"Section":"1.2"
, "Title":"Be happy."
}
]
, "Sponsor":["A","B","C"]
}
}'
然后我执行查询:
select
x.[key] topKey
, y.[key]
, y.[value]
, '{"'+ y.[key] + '":' + y.[value] +'}' jsonString
from openjson(@json) x
cross apply openjson(x.[value]) y
我从表中重置了变量@json
(即jsonString
),并重复执行上面的查询。
执行结果如下:
我一直在尝试将上面的结果存储到一个表中,并创建了下面的函数:
create function ParseJson(
@parent nvarchar(max), @json nvarchar(max))
returns @tempTable table (topKey nvarchar(max), FieldName nvarchar(max), FieldValue nvarchar(max), IsType int)
as
begin
; with cte as (
select
x.[key] topKey,
y.[key] FieldName,
y.[value] FieldValue
, iif([dbo].GetTypeId(y.[Key]) is null or y.[Key] = 'Type' ,0 ,1) IsType
from
openjson(@json) x
cross apply openjson(x.[value]) y
)
insert
@tempTable
select
x.*
from
cte x
union all
select
z.*
from
cte y
cross apply ParseJson(default,'{"'+ y.FieldName + '":' + y.FieldValue+'}') z
where y.IsType=1
return
end
-- execute
select * from ParseJson(default, @json)
字段IsType
是检查是否需要递归的条件。
[dbo].GetTypeId
是一个用户定义的函数,用于检查 FieldValue
是否为最终值,尽管它可能看起来不像用于此目的的东西。
以下是函数GetTypeId
和Type
表:
create function GetTypeId(
@typeName nvarchar(255)
)
returns nvarchar(1000)
as
begin
declare
@typeId nvarchar(1000)
select
@typeId=id
from
[Type]
where
[Type].[Name]=@typeName
return @typeId
end
go
这是错误消息:
The JSON text format is incorrect. Unexpected character '0' was found at position 13.
最佳答案
看起来和听起来都像是您试图在表中获得一个很好的非冗余编码,但并不完全清楚。
如果是这样,这是我用来执行类似操作的查询。查看输出,看看这是否是您想要的。有几点。首先,可以通过 isjson() 函数轻松确定终端节点,该函数将返回 0 值(和空值)。其次,构建任意 Id 比让 json 构建自己的 Id 更困难。第三,我扔了一个或两个空值...以捕获所有合法条件,最后...我在格式上作弊(列是 nvarchar(4000) 和 nvarchar(max)。 ..所以最终的选择有转换...但我不想混淆查询)
declare @j nvarchar(max) =
N'{
"Book":{
"IssueDate":"02-15-2019"
, "Detail":{
"Type":"Any Type"
, "Author":{
"Name":"Annie"
, "Sex":"Female"
}
}
, "Chapter":[
{
"Section":"1.1"
, "Title":"Hello world."
}
,
{
"Section":"1.2"
, "Title":"Be happy."
}
]
, "Sponsor":["A","B","C",null]
, "Hooey":null
}
}';
with nodes as
(
select
[key] ParentId,
[key] Id,
[key] Node,
[value] Val,
[type] NodeType,
isnull(abs(isjson([value])-1),1) IsTerminal
from
openjson( @j ) j
union all
select
nodes. Id,
nodes. Id + '.' + j.[key],
j.[key],
j.[value],
j.[type],
isnull(abs(isjson( j.[value] )-1),1)
from
nodes
outer apply
openjson( nodes.Val ) j
where
isjson( nodes.Val ) = 1
)
select
nodes.ParentId,
nodes. Id,
nodes.Node,
case when NodeType= 5 then '{}' when NodeType=4 then '[]' else Val end Val,
nodes.NodeType,
nodes.IsTerminal
from
nodes
...返回:
ParentId Id Node Val NodeType IsTerminal
-------------------- ------------------------------ ---------- -------------------- -------- -----------
Book Book Book {} 5 0
Book Book.IssueDate IssueDate 02-15-2019 1 1
Book Book.Detail Detail {} 5 0
Book Book.Chapter Chapter [] 4 0
Book Book.Sponsor Sponsor [] 4 0
Book Book.Hooey Hooey NULL 0 1
Book.Sponsor Book.Sponsor.0 0 A 1 1
Book.Sponsor Book.Sponsor.1 1 B 1 1
Book.Sponsor Book.Sponsor.2 2 C 1 1
Book.Sponsor Book.Sponsor.3 3 NULL 0 1
Book.Chapter Book.Chapter.0 0 {} 5 0
Book.Chapter Book.Chapter.1 1 {} 5 0
Book.Chapter.1 Book.Chapter.1.Section Section 1.2 1 1
Book.Chapter.1 Book.Chapter.1.Title Title Be happy. 1 1
Book.Chapter.0 Book.Chapter.0.Section Section 1.1 1 1
Book.Chapter.0 Book.Chapter.0.Title Title Hello world. 1 1
Book.Detail Book.Detail.Type Type Any Type 1 1
Book.Detail Book.Detail.Author Author {} 5 0
Book.Detail.Author Book.Detail.Author.Name Name Annie 1 1
Book.Detail.Author Book.Detail.Author.Sex Sex Female 1 1
(20 row(s) affected)
这显示了 ParentId
、Id
和 Node
,但实际上,Id
列是多余的。您不需要它来重建 json
。然而,包含一个序列可能会更方便。
最后一点...我认为在 cte 内部进行递归可能比在 cte 外部更容易,因为您不必交叉应用该函数...如引用的答案中所示。如果您愿意,您仍然可以将其封装在函数中。
编辑(可能是TL;NR)
我建议对节点进行排序对于以后的重组来说是一个好主意...并且将选择放入一个函数中可能是可取的...然后我为没有这样做而感到内疚:-)所以,在这里'
生成的输出不按整个文档顺序排列,而是按程序集顺序排列。也就是说,对于任何给定的节点,所有上层节点都保证在输出中较早......并且父节点的所有子节点都按文档顺序排列。我向该函数添加了一个相对序列号和一个深度指示器,认为这些值在某些情况下可能有用。
将其放入 cte 内部进行递归的函数的一个好处是,生成的函数可以是内联表值函数,这通常比累积表变量的表值函数更有效。
create function dbo.JsonNodes( @j nvarchar( max ) ) returns table as return
(
with nodes as
(
select
[key] ParentId,
[key] Id,
[key] Node,
[value] Val,
[type] Type,
isnull( abs( isjson( [value] ) -1 ), 1 ) IsLeaf,
1 Depth,
convert( bigint, 1 ) Seq
from
openjson( @j ) j
union all
select
nodes.Id,
nodes.Id + '.' + j.[key],
j.[key],
j.[value],
j.[type],
isnull( abs( isjson( j.[value] ) -1 ), 1 ),
nodes.Depth + 1,
row_number() over( partition by nodes.Id order by nodes.Id )
from
nodes
outer apply
openjson( nodes.Val ) j
where
isjson( nodes.Val ) = 1
)
select
ParentId,
Id,
Node,
case when Type=5 then '{}' when Type=4 then '[]' else Val end Val,
Type,
IsLeaf,
Depth,
Seq
from
nodes
)
关于json - 如何使用mssql递归解析JSON字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54901197/
在本教程中,您将借助示例了解 JavaScript 中的递归。 递归是一个调用自身的过程。调用自身的函数称为递归函数。 递归函数的语法是: function recurse() {
我的类(class) MyClass 中有这段代码: public new MyClass this[int index] { get {
我目前有一个非常大的网站,大小约为 5GB,包含 60,000 个文件。当前主机在帮助我将站点转移到新主机方面并没有做太多事情,我想的是在我的新主机上制作一个简单的脚本以 FTP 到旧主机并下载整个
以下是我对 AP 计算机科学问题的改编。书上说应该打印00100123我认为它应该打印 0010012但下面的代码实际上打印了 3132123 这是怎么回事?而且它似乎没有任何停止条件?! publi
fun fact(x: Int): Int{ tailrec fun factTail(y: Int, z: Int): Int{ if (y == 0) return z
我正在尝试用c语言递归地创建线性链表,但继续坚持下去,代码无法正常工作,并出现错误“链接器工具错误 LNK2019”。可悲的是我不明白发生了什么事。这是我的代码。 感谢您提前提供的大力帮助。 #inc
我正在练习递归。从概念上讲,我理解这应该如何工作(见下文),但我的代码不起作用。 请告诉我我做错了什么。并请解释您的代码的每个步骤及其工作原理。清晰的解释比只给我有效的代码要好十倍。 /* b
我有一个 ajax 调用,我想在完成解析并将结果动画化到页面中后调用它。这就是我陷入困境的地方。 我能记忆起这个功能,但它似乎没有考虑到动画的延迟。即控制台不断以疯狂的速度输出值。 我认为 setIn
有人愿意用通俗易懂的语言逐步解释这个程序(取自书籍教程)以帮助我理解递归吗? var reverseArray = function(x,indx,str) { return indx == 0 ?
目标是找出数组中整数的任意组合是否等于数组中的最大整数。 function ArrayAdditionI(arr) { arr.sort(function(a,b){ return a -
我在尝试获取 SQL 查询所需的所有数据时遇到一些重大问题。我对查询还很陌生,所以我会尽力尽可能地描述这一点。 我正在尝试使用 Wordpress 插件 NextGen Gallery 进行交叉查询。
虽然网上有很多关于递归的信息,但我还没有找到任何可以应用于我的问题的信息。我对编程还是很陌生,所以如果我的问题很微不足道,请原谅。 感谢您的帮助:) 这就是我想要的结果: listVariations
我一整天都在为以下问题而苦苦挣扎。我一开始就有问题。我不知道如何使用递归来解决这个特定问题。我将非常感谢您的帮助,因为我的期末考试还有几天。干杯 假设有一个包含“n”个元素的整数数组“a”。编写递归函
我有这个问题我想创建一个递归函数来计算所有可能的数字 (k>0),加上数字 1 或 2。数字 2 的示例我有两个可能性。 2 = 1+1 和 2 = 2 ,对于数字 3 两个 poss。 3 = 1+
目录 递归的基础 递归的底层实现(不是重点) 递归的应用场景 编程中 两种解决问题的思维 自下而上(Bottom-Up) 自上而下(Top-
0. 学习目标 递归函数是直接调用自己或通过一系列语句间接调用自己的函数。递归在程序设计有着举足轻重的作用,在很多情况下,借助递归可以优雅的解决问题。本节主要介绍递归的基本概念以及如何构建递归程序。
我有一个问题一直困扰着我,希望有人能提供帮助。我认为它可能必须通过递归和/或排列来解决,但我不是一个足够好的 (PHP) 程序员。 $map[] = array("0", "1", "2", "3")
我有数据 library(dplyr, warn.conflicts = FALSE) mtcars %>% as_tibble() %>% select(mpg, qsec) %>% h
在 q 中,over 的常见插图运算符(operator) /是 implementation of fibonacci sequence 10 {x,sum -2#x}/ 1 1 这确实打印了前 1
我试图理解以下代码片段中的递归调用。 static long fib(int n) { return n <= 1 ? n : fib(n-1) + fib(n-2); } 哪个函数调用首先被
我是一名优秀的程序员,十分优秀!