programing

Newtonsoft JSON - 동적 객체

iphone6s 2023. 3. 18. 08:22
반응형

Newtonsoft JSON - 동적 객체

Newtonsoft JSON 라이브러리를 사용하여 들어오는 raw JSON에서 동적 역직렬화를 수행하고 있는데 설명할 수 없는 것을 발견했습니다.

시작점은 다음 JSON 문자열입니다.

{
  "task": {
    "dueDate": "2012-12-03T00:00:00"
  }
}

너무 복잡할 거 없어...

코드로는 다음과 같이 합니다.

var dyn = JsonConvert.DeserializeObject<dynamic>(rawJson);
DateTime dueDate = dyn.task.dueDate.Value;

이 코드는 몇 개월 전부터 정상적으로 동작하고 있습니다만, 최근의 테스트 빌드에서는 다음과 같은 에러가 발생하고 있습니다.

'뉴턴소프트'Json.Linq.JObject'에 'task'에 대한 정의가 없습니다.

스택 트레이스: Call Site.타겟(Closure, CallSite, Object)이 시스템에 있습니다.역학.UpdateDelegates.Update And Execute 1 [T0,TRet] (Call Site 사이트, T0 arg0)

여기서부터가 이상해지고, 위의 코드를 다음과 같이 변경하면 모든 것이 다시 작동하기 시작합니다.

DateTime dueDate = dyn.task.dueDate.Value;

로.

DateTime dueDate = dyn["task"]["dueDate"].Value;

그래서 이것이 "고정"이긴 하지만, 저는 이것이 왜 문제를 해결하는지 그리고 가능한 원인이 무엇인지 이해할 수 없습니다.누구 아이디어 있는 사람?

다음과 같이 시험해 보십시오.

dynamic task = JObject.Parse(rawJson);

문서:다이내믹을 사용한JSON 쿼리

제 경우 첫 번째 기회의 예외를 포착하고 있었기 때문에 이 예외가 발생했지만 실제로는 코드 실행을 방해하지는 않았습니다.

Json에 의해 역직렬화된 일부 콘텐츠에서 이러한 현상이 발생하는 이유를 알고 싶습니다.NET, 그러나 모든 콘텐츠는 아닙니다.예를 들어 유닛 테스트에서 json.net과 시리얼화한 다이내믹오브젝트가 있습니다.그 후 시리얼화된 콘텐츠의 시리얼화를 해제합니다.직렬화된 내용은 런타임 바인더 예외를 발생시키는 내용과 동일합니다.

저도 같은 문제가 있었어요.

Json.NET 6.0.4가 이 문제의 원인입니다.Json으로 바꾸세요.넷 6.0.5프로젝트 중 어느 것도 Json을 참조해서는 안 됩니다.NET 6.0.4.

툴 -> NuGet 패키지 매니저 -> 솔루션용 NuGet 패키지 관리...Json을 사용하는 프로젝트가 있는지 확인합니다.NET 6.0.4, 수정하십시오.

이것은 분명히 참조에 관한 문제이며, 같은 문제가 있었습니다만, 알고 보니 VSS에서 확인할 수 있도록 패키지 폴더를 프로젝트에 추가했기 때문입니다(죄송합니다.필수). Visual Studio에서 패키지 폴더를 삭제하자마자 정상적으로 동작하기 시작했습니다.

잠시 동안 이 문제가 발생했는데 사용된 DLL은 에 대해 컴파일된 것입니다.다이내믹을 지원하지 않음NET 3.5...DLL 이 컴파일 되어 있는 것을 확인합니다.NET 4.5 이후

Json을 사용하는 앱에서도 같은 문제가 있었습니다.NET. 특정 머신에서만 문제가 재발하여 머신에 다른 버전의 Json이 있는 것으로 나타났습니다.GAC에 NET이 설치되어 있다.GAC에서 삭제 후 앱이 정상적으로 동작하기 시작했습니다.

저는 많은 역동적인 작업을 하는 프로젝트를 하면서 비슷한 문제를 겪었습니다.

제가 범위를 좁힌 건...Json Element 및 시리얼화.Dynamic을 사용하면 기본 유형이 존재하며 JSON에 대한 직렬화는 해당 개체를 직렬화할 대상을 지정합니다.Dynamic은 문자열, 숫자, 날짜, True, false 등일 수 있습니다.따라서 메타데이터도 약간 내려놓아야 합니다.다이나믹을 참조할 때 시리얼라이제이션에 대해 알 수 있습니다.

따라서 시리얼화하면 다이내믹이 JsonElement로 변환됩니다.ValueKind와 Value를 속성으로 지정합니다.

직렬화를 해제하면 일이 복잡해져요JSON-C#은 클래스 속성과 일치하며, 대상으로서 동적인 경우 JSON 요소 정보를 기반으로 동적 복원을 수행해야 합니다.

여기서부터 문제가 생깁니다만, Serialzation을 들여다보고 ValueKind를 보면 다른 쪽에 문제가 있을 가능성이 높다는 것을 확실히 알고 있습니다.

텍스트도 봐주세요.Json (MS) deserialization, serialization은 뉴턴소프트와 MS가 다이내믹스의 serialization과 deserialization을 처리하는 방법의 차이라고 생각합니다.

언급URL : https://stackoverflow.com/questions/13683757/newtonsoft-json-dynamic-objects

반응형