问题描述
我有一张表,其中有几列和一列(我们将其称为EXIF
)是varchar
,其中包含有效的JSON字符串。
我想选择带有FOR JSON
的表,并希望将EXIF
列中的JSON数据作为JSON结果的一部分。
现在,EXIF
列中的数据以字符串形式返回并在结果中转义。
SELECT Col1,EXIF FROM blah FOR JSON AUTO
预期:
{"Col1": "something","EXIF": {"GPS": "xxx"}}
我得到的是什么
{"Col1": "something","EXIF": "{\"GPS\": \"xxx\"}"}
解决方法
您可以使用import turtle
turtle.setup(1440,900)
turtle.bgcolor('black')
# Setup
t = turtle.Turtle()
t.penup()
t.goto(-40,-50)
t.pendown()
# Yellow Square
t.color('yellow')
t.begin_fill()
t.forward(100)
t.left(90)
t.forward(100)
t.left(90)
t.forward(100)
t.left(90)
t.forward(100)
t.left(90)
t.end_fill()
# Orange Parallelogram
t.color('orange')
t.begin_fill()
t.left(135)
t.forward(60)
t.right(45)
t.forward(100)
t.left(45)
t.backward(60)
t.end_fill()
# Red Parallelogram
t.color('red')
t.begin_fill()
t.penup()
t.forward(60)
t.right(45)
t.right(90)
t.pendown()
t.forward(100)
t.right(45)
t.forward(60)
t.end_fill()
t.penup()
t.color('black')
t.forward(100)
turtle.done()
函数,该函数还指示JSON对象的格式是否有效(如果从select语句返回无效错误,则表示错误),以消除这些缺陷转义字符,例如
library(shiny)
library(DT)
shinyApp(
ui = fluidPage(
DTOutput('x1'),),server = function(input,output,session) {
# create a character vector of shiny inputs
shinyInput = function(FUN,len,id,value,width) {
if (length(value) == 1) value <- rep(value,len)
inputs = character(len)
for (i in seq_len(len)) {
inputs[i] =
as.character(FUN(paste0(id,i),label = NULL,value = value[i],width = width))
}
inputs
}
# obtain the values of inputs
shinyValue = function(id,initial) {
vapply(seq_len(len),function(i) {
value = input[[paste0(id,i)]]
if (is.null(value)) initial[i] else value
},FUN.VALUE = logical(1))
}
n = 10
YN = rep(c(FALSE,TRUE),times = c(5,5))
df1 = data.frame(
cb = shinyInput(checkboxInput,n,'cb_',value = YN,width='30px'),month = month.abb[1:n],YN = YN,ID = seq_len(n),stringsAsFactors = FALSE
)
loopData = reactive({
values = shinyValue('cb_',initial = YN)
dat = df1
dat$cb = shinyInput(checkboxInput,value = values,width = '30px')
dat$YN = values
dat
})
output$x1 = renderDT(
df1,class = "display compact",escape = FALSE,selection = 'none',options = list(
dom = 't',paging = FALSE,ordering = FALSE,preDrawCallback = JS('function() { Shiny.unbindAll(this.api().table().node()); }'),drawCallback = JS('function() { Shiny.bindAll(this.api().table().node()); } ')
))
proxy = dataTableProxy('x1')
observe({
replaceData(proxy,loopData(),resetPaging = FALSE)
})
}
)
,
已经解决。关键是将JSON_QUERY
放在CASE
之外。
不起作用
SELECT Col1,CASE WHEN ISJSON(EXIF)=1 THEN JSON_QUERY(EXIF) END AS EXIF2
FROM BLAH
FOR JSON AUTO
工作
SELECT Col1,JSON_QUERY(CASE WHEN ISJSON(EXIF)=1 THEN EXIF END) AS EXIF2
FROM BLAH
FOR JSON AUTO