Development Tip

JSON을 IEnumerable로 역 직렬화하는 방법

yourdevel 2020. 11. 21. 09:12
반응형

JSON을 IEnumerable로 역 직렬화하는 방법 Newtonsoft JSON.NET으로


이 JSON이 주어지면 :

[
  {
    "$id": "1",
    "$type": "MyAssembly.ClassA, MyAssembly",
    "Email": "me@here.com",
  },
  {
    "$id": "2",
    "$type": "MyAssembly.ClassB, MyAssembly",
    "Email": "me@here.com",
  }
]

및 이러한 클래스 :

public abstract class BaseClass
{
    public string Email;
}
public class ClassA : BaseClass
{
}
public class ClassB : BaseClass
{
}

JSON을 다음과 같이 역 직렬화하려면 어떻게해야합니까?

IEnumerable<BaseClass> deserialized;

추상적 JsonConvert.Deserialize<IEnumerable<BaseClass>>()이라고 불평 하기 때문에 사용할 수 없습니다 BaseClass.


당신은 필요합니다 :

 JsonSerializerSettings settings = new JsonSerializerSettings
                 {
                     TypeNameHandling = TypeNameHandling.All
                 };

string strJson = JsonConvert.SerializeObject(instance, settings);

따라서 JSON은 다음과 같습니다.

{
  "$type": "System.Collections.Generic.List`1[[MyAssembly.BaseClass, MyAssembly]], mscorlib",
  "$values": [
    {
      "$id": "1",
      "$type": "MyAssembly.ClassA, MyAssembly",
      "Email": "me@here.com",
    },
    {
      "$id": "2",
      "$type": "MyAssembly.ClassB, MyAssembly",
      "Email": "me@here.com",
    }
  ]
}

그런 다음 역 직렬화 할 수 있습니다.

BaseClass obj = JsonConvert.DeserializeObject<BaseClass>(strJson, settings)

문서 : TypeNameHandling 설정


다음은 json에서 $ type을 채우지 않고 수행하는 방법입니다.

Json 변환기 :

public class FooConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(BaseFoo));
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject jo = JObject.Load(reader);
        if (jo["FooBarBuzz"].Value<string>() == "A")
            return jo.ToObject<AFoo>(serializer);

        if (jo["FooBarBuzz"].Value<string>() == "B")
            return jo.ToObject<BFoo>(serializer);

        return null;
    }

    public override bool CanWrite
    {
        get { return false; }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

그것을 사용 :

var test = JsonConvert.DeserializeObject<List<BaseFoo>>(result, new JsonSerializerSettings() 
{ 
    Converters = { new FooConverter() }
});

여기 에서 가져온


deserialize하는 동안 다음 JsonSerializerSettings 구성을 사용하십시오.

new JsonSerializerSettings()
{
    TypeNameHandling = TypeNameHandling.Objects
})

클래스에서 열거 형을 래핑 할 수도 있습니다.

class Wrapper
{
    IEnumerable<BaseClass> classes;
}

그런 다음 이것을 직렬화하고 역 직렬화하십시오.

참고 URL : https://stackoverflow.com/questions/6348215/how-to-deserialize-json-into-ienumerablebasetype-with-newtonsoft-json-net

반응형