2014-03-25 2 views
1

JSON 형식에 JSON .NET을 사용하는 WebAPI를 사용하고 있습니다. 는 C# 측면에서 나는이처럼 보이는 DTO 있습니다역 직렬화시 JSON .NET 차단 속성 이름

public class DTO1 : IManifestContainer 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; }   
    public HashSet<string> Manifest { get; private set; } 
} 
public interface IManifestContainer 
{ 
    HashSet<string> Manifest { get; } 
} 

IManifestContainer 인터페이스의 아이디어는 클라이언트가 실제로 JSON 객체의 서버로 전송하는 특성을 추적하는 것입니다. 예를 들어, 클라이언트가 JSON을 보내는 경우 :

{"FirstName":"Jojo"} 

Manifest 해시 세트에는 "성"만 포함됩니다. 클라이언트가 보내는 경우 :

{"FirstName":"Jojo", "LastName":"Jones"} 

매니페스트 HashSet의는 "FIRSTNAME"과 "성"을 모두 포함됩니다.

나는이 같은 JsonConverter을 구현하는 시도 :

public class ManifestJsonConverter : JsonConverter 
{ 
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
{ 
    if (reader.TokenType == JsonToken.Null) 
    { 
     return null; 
    } 

    JObject jObject = JObject.Load(reader); 

    // Convert the JObject to a C# object?? 
    // Passing the serializer will call this method again 
    object retVal = jObject.ToObject(objectType, serializer); 

    IManifestContainer manifestContainer = (IManifestContainer) retVal; 

    foreach (var jProperty in jObject.Properties()) 
    { 
     manifestContainer.Manifest.Add(jProperty.Name); 
    } 
    return retVal; 
} 

public override bool CanConvert(Type objectType) 
{ 
    return typeof (IManifestContainer).IsAssignableFrom(objectType); 
} 
} 

내가 클라이언트에서 오는 모든 속성을 얻기 위해하는 jobject를로드해야하지만 그때 objectType의 "의 인스턴스를 생성하는 방법을 모른다 "(C# DTO) JObject에서.

답변

0

JsonSerializer이 아닌 JObject.ToObject의 오버로드를 사용해 볼 수 있습니다. 이 경우 ToObject 메서드는 [JsonConverter] 특성을 사용하여 DTO 클래스를 꾸며 놓지 않은 한 변환기에 대해 알지 못하는 새 serializer 인스턴스를 사용합니다.이 메서드는 작동하도록 허용해야합니다.

object retVal = jObject.ToObject(objectType); 

문제가 해결되지 않으면

은, 다른 옵션은 수동으로 DTO 인스턴스를 생성하고 반사를 통해 자신의 특성을 채우는 것입니다.

+0

전체 그래프를 비 직렬화하는 동안 보존해야하는 다른 설정이 포함되어 있기 때문에 동일한 직렬기를 유지해야합니다. – oscarmorasu

1

this other post을 읽은 후이 구현이 떠 올랐습니다. 모든 경우에 적용됩니다.

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     if (reader.TokenType == JsonToken.Null) 
     { 
      return null; 
     } 

     JObject jObject = JObject.Load(reader); 

     JArray manifestArray = new JArray(); 

     foreach (var jProperty in jObject.Properties()) 
     { 
      manifestArray.Add(jProperty.Name); 
     } 

     jObject["Manifest"] = manifestArray; 

     var retVal = Activator.CreateInstance(objectType); 

     serializer.Populate(jObject.CreateReader(), retVal); 

     return retVal; 
    }