2013-09-02 4 views
2

으로 serialize합니다. FooCollectionIEnumerable<Foo>을 구현하고, 해당 이름으로 Foo를 조회 할 수있는 인덱서를 제공합니다. 기능적으로 사전으로 읽기 전용입니다. 그러나 사용자가 키를 결정하지 않기 때문에 사전이 아닙니다.Newtonsoft.Json 사전 (색인 작성기) 모음을

어쨌든, JSON.NET이이 객체를 JSON 사전으로 직렬화하기를 원합니다. JsonDictionaryAttribute을 붙이면 작동하지 않습니다. 그러면 아무것도하지 않습니다.

단서?

+1

이 과정을 설명하는 대신 코드를 게시하지 않는 이유 : 여기

class Program { static void Main(string[] args) { FooCollection coll = new FooCollection(); coll.Add(new Foo { Id = 1, Name = "Moe" }); coll.Add(new Foo { Id = 2, Name = "Larry" }); coll.Add(new Foo { Id = 3, Name = "Curly" }); JsonSerializerSettings settings = new JsonSerializerSettings(); settings.Converters.Add(new FooCollectionConverter()); settings.Formatting = Newtonsoft.Json.Formatting.Indented; string json = JsonConvert.SerializeObject(coll, settings); Console.WriteLine(json); } } 

그리고

은 위의 프로그램의 출력입니다. – I4V

답변

5

FooCollection 클래스의 경우 사용자 정의 JsonConverter을 만들어야 원하는 방식으로 직렬화 할 수 있습니다. 코드를 전혀 게시하지 않았기 때문에 예제로 만 만들 것입니다. 의이 FooFooCollection 클래스는 다음과 같이 가정 해 봅시다 : 그것은 사전 것처럼

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" 
    } 
}