.net 如何在JsonConverter中将数组转换为对象
我想通过使用JsonConverter将属性的类型从数组更改为对象。例如,我有这样一个属性[{Name:aaa}]。序列化之后,我希望得到如下结果{{uu po:Add,Objects:[{Name:aaa}]} 因此,我创建了一个用于自定义序列化程序的类:.net 如何在JsonConverter中将数组转换为对象,.net,json.net,serialization,.net,Json.net,Serialization,我想通过使用JsonConverter将属性的类型从数组更改为对象。例如,我有这样一个属性[{Name:aaa}]。序列化之后,我希望得到如下结果{{uu po:Add,Objects:[{Name:aaa}]} 因此,我创建了一个用于自定义序列化程序的类: public class Serializer : ISerializer { public JsonSerializerSettings SerializerSettings { get; set; } public S
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.WriteEstate的类型是WriteEstate.Array,但问题是我无法设置WriteEstate的值以返回对象。您是否有其他解决方案来处理此问题?我认为您误解了如何在JSONTransfer中使用JsonWriter。你永远不应该弄乱作者的财产。它是一个只读属性,指示写入程序当前正在写入的内容。你不能直接改变它。相反,您应该使用编写器的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();
}
}
输出:
{"__po":"Add","Objects":[{"Name":"aaa"},{"Name":"bbb"}]}
Fiddle:JsonWriter拥有此属性public WriteState WriteState{get;}谁可以返回这样的枚举“public enum WriteState{Error=0,Closed=1,Object=2,Array=3,Constructor=4,property=5,Start=6}”'在我的情况下Writer.WriteState的值是WriteState.Array,但问题是我无法设置Writer.WriteState的值以返回对象。这正是我需要的。非常感谢您。@Brian先生:
{"__po":"Add","Objects":[{"Name":"aaa"},{"Name":"bbb"}]}