2017-11-06 7 views
0

내가 어떻게이 DataObject 한 단계 위로 이동할 수 있습니다 I 형 JsonObject의 객체를 직렬화 때, 출력C#을 사용하여 JSON.net에서 JSON 객체의 깊이를 한 단계 위로 이동하는 방법은 무엇입니까?

{"DataObject":{"id":"1","name":"data name"}} 

다음 얻을 JSON.net

를 사용하여 클래스의 변환기를 쓰기 위해 노력하고 있어요 다음 출력을 얻으십시오 :

{"id":"1","name":"data name"} 

아래 관련 코드를 찾을 수 있습니다.

내 클래스의 형식은 다음과 같습니다 나는이 문서에서 this page을 언급하고 다음과 같은 변환 쓴

public class MyDataObject : IDataObject 
{ 
    [JsonProperty(PropertyName = "id", Required = Required.Always)] 
    public string Id { get; set; } 

    [JsonProperty(PropertyName = "name", Required = Required.Always)] 
    public string Name { get; set; } 
} 

:

public class JsonDataObjectConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return typeof(IDataObject).GetTypeInfo().IsAssignableFrom(objectType.GetTypeInfo()); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     if (value is MyDataObject dataObject) 
     { 
      writer.WriteStartObject(); 

      writer.WritePropertyName("id"); 
      writer.WriteValue(dataObject.Id); 
      writer.WritePropertyName("name"); 
      writer.WriteValue(dataObject.Name); 

      writer.WriteEndObject(); 
     } 
    } 
} 

public class JsonObject 
{ 
    public JsonObject(IDataObject dataObject) 
    { 
     this.DataObject= dataObject; 
    } 

    [JsonConverter(typeof(JsonDataObjectConverter))] 
    public IDataObject DataObject; 
} 

DataObject 몇 가지 특성을 가지고 어떤 도움을 주셔서 감사합니다. 고맙습니다.

+0

내가 그 방법을 볼 수

public class JsonObjectConverter : JsonConverter { public override bool CanConvert(Type objectType) { return typeof(IDataObject).GetTypeInfo().IsAssignableFrom(objectType.GetTypeInfo()); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { throw new NotImplementedException(); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { JsonObject jsonObject = (JsonObject)value; if (jsonObject.DataObject.GetType() == typeof(MyDataObject)) { MyDataObject dataObject = (MyDataObject) jsonObject.DataObject; writer.WriteStartObject(); writer.WritePropertyName("id"); writer.WriteValue(dataObject.Id); writer.WritePropertyName("name"); writer.WriteValue(dataObject.Name); writer.WriteEndObject(); } } } 

이 원하는 출력을 제공 레벨을 받고 있지만, 왜 그것을 제거하고 싶은지 궁금합니다. –

+0

JSON을 보낼 응용 프로그램은 추가 수준이 없다고 예상합니다. –

+0

이 사이트를 확인하십시오. https://stackoverflow.com/questions/34007512/webapi-return-json-array-without-root-node –

답변

0

컨버터를 속성 대신 클래스로 이동하고 [JsonIgnore]을 사용하여 속성을 무시하면 원하는 결과를 얻을 수있었습니다. 클래스의 변환기가 아래 표시된 것처럼 속성에 대한 JSON을 생성하므로 속성을 무시해야합니다.

그래서 JsonObject 클래스가 될 것입니다 :

[JsonConverter(typeof(JsonObjectConverter))] 
public class JsonObject 
{ 
    public JsonObject(IDataObject dataObject) 
    { 
     this.DataObject= dataObject; 
    } 

    [JsonIgnore] 
    public IDataObject DataObject; 
} 

는 다음과 같은 컨버터를 만듭니다

{"id":"1","name":"data name"}