>백엔드 개발 >C++ >BaseType이 Abstract인 경우 Newtonsoft JSON.NET을 사용하여 JSON을 IEnumerable로 역직렬화하는 방법은 무엇입니까?

BaseType이 Abstract인 경우 Newtonsoft JSON.NET을 사용하여 JSON을 IEnumerable로 역직렬화하는 방법은 무엇입니까?

DDD
DDD원래의
2025-01-17 13:36:09950검색

How to Deserialize JSON into an IEnumerable with Newtonsoft JSON.NET when BaseType is Abstract?

Newtonsoft JSON.NET을 사용하여 JSON을 IEnumerable<기본 클래스>로 역직렬화합니다.

BaseType이 추상 클래스인 경우 JsonConvert.Deserialize를 사용하여 JSON 데이터를 IEnumerable로 역직렬화하는 것이 어려울 수 있습니다.

질문:

다음 JSON을 고려하세요.

<code>[
  {
    "$id": "1",
    "$type": "MyAssembly.ClassA, MyAssembly",
    "Email": "[email\u00a0protected]"
  },
  {
    "$id": "2",
    "$type": "MyAssembly.ClassB, MyAssembly",
    "Email": "[email\u00a0protected]"
  }
]</code>

및 다음 추상 기본 및 파생 클래스:

<code>public abstract class BaseClass
{
    public string Email;
}
public class ClassA : BaseClass
{
}
public class ClassB : BaseClass
{
}</code>

JSON을 역직렬화하려고 할 때:

<code>IEnumerable<基类> deserialized;</code>

JsonConvert.Deserialize>()을 사용하면 BaseClass가 추상이므로 오류가 발생합니다.

해결책:

이 문제를 해결하려면 JsonSerializerSettings의 TypeNameHandling 설정을 사용하세요. 이 설정을 TypeNameHandling.All로 설정하면 유형 정보가 역직렬화된 JSON에 포함됩니다.

<code>JsonSerializerSettings settings = new JsonSerializerSettings
{
    TypeNameHandling = TypeNameHandling.All
};

string strJson = JsonConvert.SerializeObject(instance, settings);</code>

업데이트된 JSON:

<code>{
  "$type": "System.Collections.Generic.List`1[[MyAssembly.BaseClass, MyAssembly]], mscorlib",
  "$values": [
    {
      "$id": "1",
      "$type": "MyAssembly.ClassA, MyAssembly",
      "Email": "[email\u00a0protected]",
    },
    {
      "$id": "2",
      "$type": "MyAssembly.ClassB, MyAssembly",
      "Email": "[email\u00a0protected]",
    }
  ]
}</code>

이제 유형 정보를 포함하면 역직렬화가 올바르게 수행됩니다.

<code>IEnumerable<BaseClass> obj = JsonConvert.DeserializeObject<IEnumerable<BaseClass>>(strJson, settings);</code>

위 내용은 BaseType이 Abstract인 경우 Newtonsoft JSON.NET을 사용하여 JSON을 IEnumerable로 역직렬화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.