2016-06-07 3 views
1

현재 역 직렬화하려는 잘못된 Json이있는 상황을 해결하기 위해 노력하고 있습니다. 클린치 포인트는 재산 할당이 : 문자 대신에 =으로 선언 된 곳에 Json이 공급된다는 것입니다.잘못된 마크 업으로 Json을 역 직렬화

예 JSON :

{ 
    "Field1" = "Hello", 
    "Field2" = "Stuff", 
    "Field3" = "I am non-Json Json, fear me", 
    "Field4" = 8 
} 

누군가가 = 대신 봤는데 :

의 사용에 C 번호에 관한 구조의 객체로이 역 직렬화하는 Json.Net를 사용하는 행운이 있었다 = 과거 읽어 JsonConverter를 작성하려고하지만 항상 대신 :=을 얻고 메시지와 함께 예외가 발생있어 불만 '예상'을 '만 가지고 :. = 경로' ' ".

나는 내 자신의 직렬화 프로세스를 작성하고 Json.Net 라이브러리를 사용하지 않는 것을 제외하고 지난 어떤 방식으로 표시되지 않습니다. 이는 유효한 JSON 인에 가까운 뭔가 짜증 (그러나 나는 그것이 무효로 충분히 공평 가정) reader.ReadAsString();는이 Field1을 읽어야 칠 때

하지만, 분명히 그것은 : 아직 친구를 충족하지 않은 등 진행 "도대체 여기서 뭐하는거야?!"라고 말하면서 넘어지게된다. 실제로 표시 할 내용이 많지 않으므로 어떤 JsonConverter 구현 예제도 없습니다. 그냥 "읽기 ..."방법 중 하나를 사용하려고 시도하고 그렇게하지 못했습니다.

+5

속성 할당이 a : 문자 대신 =로 선언되면 JSON이 아닙니다. 기간. 만약 객체의 값에'='가 없으면'String.Replace ("=", ":")'를 수행 한 다음 구문 분석을 시도하십시오 – Nkosi

+3

이 파일의 공급자에게 선미를 제공하십시오 표준에 대해 이야기하고 json을 사용할 계획이라면 올바르게 구현해야합니까? 왜 당신은 노력을해야 할 것인가? 공급 업체가 잘못된 포맷을 발송할 때 (비록 @Nkosi 응답이 더 쉬운 것 같지만 실제로 전달 된 경우에 "예기치 않은"결과를 줄 수도있다. 문자열 내용 (문자열 값 자체를 바꾸는 것은 또한 anoying 일 수 있습니다. nl, 의도적으로 무엇을합니까 : 부호)) – Icepickle

+0

'String.Replace'보다 약간 더 안전한 옵션을 원한다면 정규 표현식을 만들 수 있습니다 그것은 데이터의 "="내부가 변환되지 않았 음을 보장합니다. 그러나 @Icepickle에 동의하고 공급자에게 이야기하고 그들의 허위 사실을 고치라고 말합니다. –

답변

2

속성 할당이 : 문자 대신 =으로 선언되는 경우 JSON이 아닙니다.

당신이 개체의 값의 모든 = 다음 당신이

string json = invalidData.Replace("=", ":"); 

수행 한 후 구문 분석을 시도 할 수 있습니다 기대하지 마십시오.

@Icepickle에서 언급 한 바와 같이

,이 일에 관여하는 위험이있다.

내 대답은 빠른 수정/해결 방법으로 작동하지만 당신은 결국 당신이 받고있는 데이터가 유효 JSON 있는지 확인해야합니다.

은 무효 JSON을 역 직렬화하려고 아무 소용이 없습니다.

+0

나는 이것을 생각합니다. 우리가 상황을 생각할 때 얻을 수있는 최선입니다. 우리는 보장 할 수 있습니다 (적어도 그들은 절대 안된다고 말합니다). 데이터의 필드 이름에는 절대로 없을 것입니다. 그래서 이것이 우리가 할 일입니다. 나는 우리 모두가 그것이 좋거나 "좋은 형태"는 아니지만 그것이 삶이라는 것에 동의 할 수 있다고 생각합니다. – Skintkingle

+1

@Skintkingle 필드 이름뿐만 아니라 필드의 값도이 값을 가져서는 안됩니다.이 값을 보장 할 수 있다고는 생각지 않습니다. 적어도 텍스트 문자열을 채울 자유는 없습니다. – Icepickle

2

다른 사람들이 제안한 것처럼이 문제를 해결하는 가장 쉬운 방법은 간단한 문자열 바꾸기를 사용하여 구문 분석하기 전에 문자를 :의 JSON 문자열 내로 변경하는 것입니다. 물론 = 자의 데이터 값이있는 경우 해당 문자도 대체 문자로 맹 글링됩니다.

데이터에 = 자의 문자가 포함될 것으로 염려되는 경우이 단계를 더 진행하고 Regex를 사용하여 대체 할 수 있습니다.

string validJson = Regex.Replace(invalidJson, @"(""[^""]+"")\s?=\s?", "$1 : "); 

바이올린 : https://dotnetfiddle.net/yvydi2


또 다른 가능한 해결책은 JSON을 변경하는 것입니다 예를 들어, 다음 정규식은 즉시 인용 속성 이름을 따라 = 문자를 대체합니다.유효한 소스 코드가 인 :이 유효한 JSON에 정상적으로 표시되도록 허용하는 인터넷 소스 코드입니다. 이것은 아마도 파싱 측면에서 가장 안전한 옵션 일 것이지만 조금 더 노력해야합니다. 이 경로를 찾으려면 GitHub에서 최신 source code을 다운로드하고 Visual Studio 2015에서 솔루션을 엽니 다. 프로젝트의 루트에서 JsonTextReader 클래스를 찾습니다. 이 클래스 안에는 ParseProperty이라는 private 메서드가 있습니다. 이에 위의 if 문을 변경하는 경우

if (_chars[_charPos] != ':') 
{ 
    throw JsonReaderException.Create(this, "Invalid character after parsing property name. Expected ':' but got: {0}.".FormatWith(CultureInfo.InvariantCulture, _chars[_charPos])); 
} 

가 :

if (_chars[_charPos] != ':' && _chars[_charPos] != '=') 

다음 독자가 구분 기호로 모두 := 문자를 허용하는 메소드의 끝 부분이 보이는 몇 가지 코드 속성 이름과 값 사이. 변경 사항을 저장하고 라이브러리를 다시 빌드하면 "특수한"JSON에서 사용할 수 있습니다.

+0

이것은 아름답습니다. 생각. 저는 실제로 이런 식으로 Json.Net 코드를 수정하고 로컬에서 유지하는 아이디어를 좋아합니다. 나는 NuGet을 통해 그것을 최신으로 유지할 수 없다는 것을 슬퍼 할 것이다. 내가 추측하는 이러한 것들에는 항상 단점이있다. 미래에이 솔루션을 개선하기 위해 계획하고있는 내용입니다. 아이디어를 주셔서 정말 감사합니다. – Skintkingle

+0

실제로 소스 코드를 로컬로 수정하는 문제는 마스터 레포에서 최신 버전으로 업데이트 할 때마다 변경 사항을 다시 적용해야한다는 것입니다. 일반적으로 해결 방법은 마스터 프로젝트에 수정 사항을 다시 제출하는 것입니다. 그러나이 경우 변경 사항은 너무 전문화되어 있으므로 받아 들일 수 있을지는 의문입니다. –

관련 문제