입력 문자열이 유효한 Json이 아니고 숫자이거나 숫자로 시작하는 경우 JsonConvert.DeserializeObject를 사용하세요.

StackOverflow https://stackoverflow.com//questions/22015670

문제

숫자로 시작하거나 숫자만 포함하는 일반 문자열 역직렬화를 처리하고 지금처럼 작동하지 않는 이유를 이해하기 위한 좋은 솔루션을 찾고 싶습니다.

입력 문자열을 제어할 수 없으므로 유효한 Json이라고 믿을 수 없습니다. 지금은 Json인지 확인하고 Json이 아닌 경우 "[{}]로 래핑합니다. "하지만 더 좋은 방법이 있는지 확인하고 싶었습니다.

이것이 내가 역직렬화하는 방법입니다.

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

내 수업에는 두 가지 속성이 있습니다.

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

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

입력 문자열이 "a" 또는 "a2"인 경우 Newtonsoft.Json.JsonException("값을 구문 분석하는 동안 예기치 않은 문자가 발생했습니다.ㅏ.경로 '', 줄 0, 위치 0.")이 예상되지만 "2" 및 "2a"에서는 다른 오류가 발생합니다."a"와 "a2"와 마찬가지로 "2"와 "2a"에 대해서도 동일한 동작을 원합니다.

"2"를 전달할 때의 예외:

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[].

"2a"를 전달할 때의 예외:

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

문자열에 숫자만 포함되어 있거나 숫자로 시작하는 경우 왜 작동하지 않나요?입력 문자열을 "[{}]"로 래핑하는 것보다 이 문제를 해결하는 더 현명한 방법이 있습니까?

도움이 되었습니까?

해결책

문제는 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
    };
}

이는 다음 사항을 확인합니다. {} 어떤 객체로 시작/끝나야 하는지.우리가 { 우리는 그것이 객체라고 가정하고 역직렬화할 수 있습니다. 그렇지 않은 경우 수동으로 클래스의 인스턴스를 생성하고 값을 채웁니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top