FooCollection
클래스의 경우 사용자 정의 JsonConverter
을 만들어야 원하는 방식으로 직렬화 할 수 있습니다. 코드를 전혀 게시하지 않았기 때문에 예제로 만 만들 것입니다. 의이 Foo
및 FooCollection
클래스는 다음과 같이 가정 해 봅시다 : 그것은 사전 것처럼
class Foo
{
public int Id { get; set; }
public string Name { get; set; }
}
class FooCollection : IEnumerable<Foo>
{
private List<Foo> list = new List<Foo>();
public void Add(Foo foo)
{
list.Add(foo);
}
public Foo this[string name]
{
get { return list.Find(f => f.Name == name); }
}
public IEnumerator<Foo> GetEnumerator()
{
return list.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return ((IEnumerable)list).GetEnumerator();
}
}
다음 변환기가 FooCollection
를 직렬화 것입니다. 나는 당신이 Name
속성의 값을 (컬렉션의 인덱서와 일치시키기 위해) 각 Foo
의 키로 사용하기를 원한다고 가정하고있다. 그래서 나는 그것을 구현 한 방법이다. GetFooKey()
메서드를 수정하여 다른 것으로 변경할 수 있습니다.
class FooCollectionConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(FooCollection));
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteStartObject();
foreach (Foo foo in (FooCollection)value)
{
writer.WritePropertyName(GetFooKey(foo));
serializer.Serialize(writer, foo);
}
writer.WriteEndObject();
}
// Given a Foo, return its unique key to be used during serialization
private string GetFooKey(Foo foo)
{
return foo.Name;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
다음은 변환기 사용 방법을 보여주는 예제 프로그램입니다.
{
"Moe": {
"Id": 1,
"Name": "Moe"
},
"Larry": {
"Id": 2,
"Name": "Larry"
},
"Curly": {
"Id": 3,
"Name": "Curly"
}
}
이 과정을 설명하는 대신 코드를 게시하지 않는 이유 : 여기
그리고
은 위의 프로그램의 출력입니다. – I4V