2017-11-14 3 views
-2

은 내가 API에서 JSON 응답을 얻기 위해 노력하고 R의 목록에서 견적을 교체 :목록이

test <- GET(url, add_headers(`api_key` = key)) 

content(test, 'parsed') 

내가 content(test, 'parsed')을 실행할 때, 나는 다음과 같은 오류 얻을 :이 생각

# Error: lexical error: invalid string in json text. .Note: Final passage of the "fiscal cliff bill" on January 1 

을 큰 따옴표 때문입니다. 큰 따옴표를 바꾸려면 어떻게해야합니까? 아니면 문제가 아닌지 어떻게 해결할 수 있습니까?

감사합니다.

+1

우리가 제대로 지원할 수 있도록 [Minimal, Complete, Verifiable example (https://stackoverflow.com/help/mcve)를 작성하십시오.]하십시오. – ctwheels

+0

부적절하게 생성 된 JSON을 수정하는 것은 엄청난 고통이며 과거에는 정규식을 사용했지만 https://xkcd.com/1171/. – r2evans

+0

감사합니다. r2evans. JSON이 너무 많은 곳에서 잘못되어 문제를 해결할 수 없기 때문에 해결하기로 마음 먹었습니다. :) – NadineK

답변

0

그래서 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 (([\"])) 내의 두 번째 그룹에서"방을 "; 예를 들어 작은 따옴표로 인해 문제가 발생할 수도있는 경우 그룹을 ([\"'])으로 변경할 수 있습니다. 그것이 유용하거나 심지어 필요한지 나는 모른다.