2016-11-18 50 views
1

我想通過使用JsonConverter將數組的類型更改爲對象。例如,我有這樣的財產[{"Name":"aaa"}]。序列化後,我想要得到像這樣的結果{"__po":"Add",Objects:[{"Name":"aaa"}]}如何將數組轉換爲JsonConverter中的對象

所以我創建了一個類定製我的串行:

public class Serializer : ISerializer 
{ 
    public JsonSerializerSettings SerializerSettings { get; set; } 

    public Serializer() 
    { 
     SerializerSettings = new JsonSerializerSettings(); 
     SerializerSettings.Converters.Add(new ParseArrayToObjectJsonConverter()); 
    } 

    public class ParseArrayToObjectJsonConverter : JsonConverter 
    { 
     public override bool CanConvert(Type objectType) 
     { 
      if (objectType.GetTypeInfo().Name.EndsWith("Array")) 
      { 
       return true; 
      } 
      return false; 
     } 

     public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
     { 

     } 
    } 
} 

我看到JsonWriter具有這個屬性public WriteState WriteState { get; }可以返回一個像這樣的枚舉:public enum WriteState { Error = 0, Closed = 1, Object = 2, Array = 3, Constructor = 4, Property = 5, Start = 6 }

在我的WriteJson方法中,writer.WriteState的類型是WriteState.Array,但問題是我無法設置返回對象的值WriteState。你有解決這個問題的其他解決方案嗎?

+0

JsonWriter擁有此屬性public WriteState WriteState {get; }誰可以返回一個枚舉這樣的公共枚舉WriteState { 誤差= 0, 關= 1, 對象= 2, 陣列= 3, 構造= 4, 屬性= 5, 開始= 6 } '在我的情況下,Writer.WriteState的值是WriteState.Array,但問題是我無法設置Writer.WriteState的值來返回對象。 –

回答

1

我想你是誤解如何在JsonConverter內使用JsonWriter。你永遠不需要搗亂作家的WriteState。它是一個只讀屬性,用於指示作者正在編寫的內容。你不能直接改變它。相反,你應該使用作者的WriteXxx()方法來實際寫出你想要的JSON。這裏是你將如何實現一個JsonConverter,在對象包裝了一個數組:

public class WrapArrayInObjectJsonConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     // This will cause the converter to wrap ALL IEnumerables (except strings) in an object. 
     return typeof(IEnumerable).IsAssignableFrom(objectType) && objectType != typeof(string); 

     // If you only want to this converter to wrap specific kinds of arrays, change this 
     // method accordingly. For example, this will only wrap Foo[] or List<Foo>: 
     //return typeof(IEnumerable<Foo>).IsAssignableFrom(objectType); 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     IEnumerable array = (IEnumerable)value; 
     writer.WriteStartObject(); 
     writer.WritePropertyName("__po"); 
     writer.WriteValue("Add"); 
     writer.WritePropertyName("Objects"); 
     writer.WriteStartArray(); 
     foreach (object item in array) 
     { 
      serializer.Serialize(writer, item); 
     } 
     writer.WriteEndArray(); 
     writer.WriteEndObject(); 
    } 

    public override bool CanRead 
    { 
     get { return false; } 
    } 

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

下面是一個使用轉換器的例子:

Foo[] array = new Foo[] 
{ 
    new Foo { Name = "aaa" }, 
    new Foo { Name = "bbb" } 
}; 

JsonSerializerSettings settings = new JsonSerializerSettings(); 
settings.Converters.Add(new WrapArrayInObjectJsonConverter()); 

string json = JsonConvert.SerializeObject(array, settings); 
Console.WriteLine(json); 

輸出:

{"__po":"Add","Objects":[{"Name":"aaa"},{"Name":"bbb"}]} 

小提琴: https://dotnetfiddle.net/79mXF2

+0

這正是我所需要的謝謝你非常糊狀Mr. @Brian :) –

相關問題