2017-11-06 14 views
0

私はタイプJsonObjectのオブジェクトをシリアル化するとき、私はDataObject 1レベル上を移動することができますどのように次のような出力C#を使用してJSON.netのJSONオブジェクトの深さを1レベル上に移動する方法は?

{"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"} 
関連する問題