그래서 run into a similar problem before이 있었고 JSON을 복구하려고 Jeroen의 수정 사항을 사용하는 꽤 기능을 쓰려고했습니다. 내가 어쨌든 그것을하기로 작정 한 이래로, 여기에 빠른 해킹 시도가 있습니다.
NB : 이와 같은 구조화 된 형식을 복구하는 것은 최선의 추측이며 오류가 발생하기 쉽습니다. 좋은 소식은 잘못된 결과가 나오지 않도록 충분히 구체적으로 유지하려고 시도했기 때문입니다. "단위 테스트"는 다른 코너 케이스를 실제로 확인해야합니다. 이 문제가 해결되지 않는 (또는해야 할) 것이 있거나 깨지기 쉬운 것을 발견하면 !
fix_json_quotes <- function(s) {
if (length(s) != 1) {
warning("the argument has length > 1 and only the first element will be used")
s <- s[[1]]
}
stopifnot(is.character(s))
val <- jsonlite::validate(s)
while (! val) {
ind <- attr(val, "offset") - 1
snew <- gsub("(.*)(['\"])([[:space:],]*)$", "\\1\\\\\\2\\3", substr(s, 1, ind))
if (snew != substr(s, 1, ind)) {
s <- paste0(snew, substr(s, ind + 1, nchar(s)))
} else {
break
}
val <- jsonlite::validate(s)
}
if (! val) {
# still not validating
stop("unable to fix quotes")
}
return(s)
}
일부 샘플 데이터, 단위 테스트 만약 당신이 (testthat
이 기능의 사용 방법에 대해서는 필요하지 않습니다)합니다
expect_equal(json, fix_json_quotes(json))
:
library(testthat)
lst <- list(a="final \"cliff bill\" on")
json <- as.character(toJSON(lst))
json
# [1] "{\"a\":[\"final \\\"cliff bill\\\" on\"]}"
좋아는 변화가 없을 것
약간의 불량 데이터 :
# un-escape the double quotes
badlst <- "{\"a\":[\"final \"cliff bill\" on\"]}"
expect_error(jsonlite::fromJSON(badlst))
expect_equal(json, fix_json_quotes(badlst))
추 신 : 이것은 특별히 큰 따옴표를 찾습니다. 그러나이 문제를 해결할 수있는 관련 오류가 있다고 생각합니다. 이 "regex (([\"])
) 내의 두 번째 그룹에서"방을 "; 예를 들어 작은 따옴표로 인해 문제가 발생할 수도있는 경우 그룹을 ([\"'])
으로 변경할 수 있습니다. 그것이 유용하거나 심지어 필요한지 나는 모른다.
우리가 제대로 지원할 수 있도록 [Minimal, Complete, Verifiable example (https://stackoverflow.com/help/mcve)를 작성하십시오.]하십시오. – ctwheels
부적절하게 생성 된 JSON을 수정하는 것은 엄청난 고통이며 과거에는 정규식을 사용했지만 https://xkcd.com/1171/. – r2evans
감사합니다. r2evans. JSON이 너무 많은 곳에서 잘못되어 문제를 해결할 수 없기 때문에 해결하기로 마음 먹었습니다. :) – NadineK