2014-02-25 2 views
0

숫자로 시작하거나 숫자 만 들어있는 일반 문자열의 비 직렬화를 처리하고 왜 그 것이 아닌지에 대한 좋은 해결책을 찾고 싶습니다. 지금처럼 일하지 마라.입력 문자열이 유효하지 않은 경우 JsonConvert.DeserializeObject를 사용하고 숫자로 시작하거나 숫자로 시작합니다.

입력 문자열을 제어 할 수 없어 유효하지 않은 Json에 의지 할 수 없으며 현재 Json인지 여부를 확인하고 있습니다.이 경우에는 " [{}} "하지만 더 좋은 방법이 있는지 알고 싶었습니다.

이 내가 그것을 deserialize하는거야 방법입니다

JsonConvert.DeserializeObject<MyClass[]>(myString); 

내 클래스는 두 가지 속성이 있습니다 입력 문자열 "는"또는 "A2"는 그것이 Newtonsoft을 던졌습니다 단지의 경우

[JsonProperty(PropertyName = "key")] 
public string Key { get; set; } 

[JsonProperty(PropertyName = "value")] 
public string Value { get; set; } 

을 .Json.JsonException ("값을 파싱하는 동안 예기치 않은 문자가 발생했습니다 : 경로 ', 줄 0, 위치 0"). "2"와 "2a"는 다른 오류를 발생시킵니다. "2"와 "2a"에 대해 "a"와 "a2"에 대해 동일한 동작을 원합니다. "2"를 전달

예외 : "2A"를 전달

Newtonsoft.Json.JsonSerializationException : Error converting value 2 to type 'MyClass[]'. Path '', line 1, position 1. 
System.ArgumentException : Could not cast or convert from System.Int64 to MyClass[]. 

예외 : 문자열이 숫자 만 포함하거나 시작 때

System.FormatException : Input string was not in a correct format. 

가 왜 작동하지 않습니다 번호? "[{}]"으로 입력 문자열을 래핑하는 것보다 더 똑똑한 방법이 있습니까?

+0

입력이 "2"또는 "2a"이면 어떻게 될까요? 결과에 대해 원하는 것은 무엇입니까? –

+0

Kevin, 질문을 업데이트했습니다. "a"또는 "a2"를 전달할 때와 같은 결과가 필요합니다. 즉 Newtonsoft.Json.JsonException이 발생합니다 ("값을 파싱하는 동안 예기치 않은 문자가 발생했습니다 : 경로 ' ', line 0, position 0 "). –

+0

'MyClass []'강력한 형식에 대한 입력을 deserialize하려고합니다. 그러나 입력 json은이 유형을 나타내지 않습니다. json을 입력하면 int가 유효하고 그 중 하나가 유효하고 ("2") 다른 것은 "2a"가 아닙니다. 두 번째는 json의 문자열 (예 : "\"2a \ ""C# 코드)로 작성되어야합니다. 귀하의 json이 형식이 잘못되었으므로 해결책을 제안하기 위해 부정확 한 방법을 정확히 알아야합니다. –

답변

2

문제는 JSON 구문 분석기와 전달 대상에서 비롯됩니다.

2 예컨대 그 가능성있는 객체 리터럴 외부에 존재할 수없는 불완전한 식별자 또는 속성으로 보는 것처럼 JsonConvert.DeserializeObject<int>('2');

a2하지만 그렇지 상상 유효한 값이다. 둘러싼 따옴표가 없으므로 문자열이 아닙니다.

기본적으로 JSON 구문 분석기에서 유효하지 않은 JSON을 구문 분석하려고합니다. 물론 그렇게하지는 않습니다. 귀하의 경우에는

은 사실 같은 것을 할 것 :

MyClass cls = null; 

if (json.StartsWith("{")) { 
    cls = JsonConvert.DeserializeObject<MyClass>(json); 
} else { 
    cls = new MyClass() { 
     Key = json 
    }; 
} 

이 검사를 /로 끝을 시작해야 객체 {}을 위해. 만약 우리가 {을 찾으면, 그것을 객체라고 가정하고 역 직렬화합니다. 그렇지 않다면 우리는 수동으로 클래스의 인스턴스를 만들고 그 값을 채 웁니다.

물론 여기에 몇 가지 가정을하고 있습니다.

+0

왜 파서는 "2"를 2로 취급하고 "2a"를 2a로 취급합니까? 나는 왜 그것이 똑같은 줄을 다루지 않는지 이해하지 못합니다. –

+1

그들은 그렇지 않습니다. 구문 분석기는 완벽하게 유효한 JavaScript (숫자 리터럴)이므로 2를 파싱 할 수 있습니다. 2a는 그 자체로는 아닙니다. 예를 들어 Firebug로 만든이 작은 비디오를보십시오 - http://screencast.com/t/2UqQwvDiyW9p – Lloyd

+0

정말 고마워요! –