如何使用 Json.Net 序列化/反序列化具有附加属性的自定义集合 [英] How to serialize/deserialize a custom collection with additional properties using Json.Net
问题描述
我有一个自定义集合(实现 IList),它有一些自定义属性,如下所示:
I have a custom collection (implements IList) which has some custom properties as shown below:
class FooCollection : IList<Foo> {
private List<Foo> _foos = new List<Foo>();
public string Bar { get; set; }
//Implement IList, ICollection and IEnumerable members...
}
当我序列化时,我使用以下代码:
When I serialize, I use the following code:
JsonSerializerSettings jss = new JsonSerializerSettings() {
TypeNameHandling = TypeNameHandling.Auto
};
string serializedCollection = JsonConvert.SerializeObject( value , jss );
它正确序列化和反序列化所有集合项;但是,不考虑 FooCollection
类中的任何额外属性.
It serializes and deserializes all the collection items properly; however, any extra properties in the FooCollection
class are not taken into account.
无论如何要将它们包含在序列化中?
Is there anyway to include them in the serialization?
推荐答案
问题如下:当一个对象实现了 IEnumerable
时,JSON.net 将其标识为一个值数组并序列化如下数组 Json 语法(不包括属性),例如:
The problem is the following: when an object implements IEnumerable
, JSON.net identifies it as an array of values and serializes it following the array Json syntax (that does not include properties),
e.g. :
[ {"FooProperty" : 123}, {"FooProperty" : 456}, {"FooProperty" : 789}]
如果你想序列化它保留属性,你需要通过定义一个自定义的JsonConverter
来手动处理那个对象的序列化:
If you want to serialize it keeping the properties, you need to handle the serialization of that object by hand by defining a custom JsonConverter
:
// intermediate class that can be serialized by JSON.net
// and contains the same data as FooCollection
class FooCollectionSurrogate
{
// the collection of foo elements
public List<Foo> Collection { get; set; }
// the properties of FooCollection to serialize
public string Bar { get; set; }
}
public class FooCollectionConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(FooCollection);
}
public override object ReadJson(
JsonReader reader, Type objectType,
object existingValue, JsonSerializer serializer)
{
// N.B. null handling is missing
var surrogate = serializer.Deserialize<FooCollectionSurrogate>(reader);
var fooElements = surrogate.Collection;
var fooColl = new FooCollection { Bar = surrogate.Bar };
foreach (var el in fooElements)
fooColl.Add(el);
return fooColl;
}
public override void WriteJson(JsonWriter writer, object value,
JsonSerializer serializer)
{
// N.B. null handling is missing
var fooColl = (FooCollection)value;
// create the surrogate and serialize it instead
// of the collection itself
var surrogate = new FooCollectionSurrogate()
{
Collection = fooColl.ToList(),
Bar = fooColl.Bar
};
serializer.Serialize(writer, surrogate);
}
}
然后使用如下:
var ss = JsonConvert.SerializeObject(collection, new FooCollectionConverter());
var obj = JsonConvert.DeserializeObject<FooCollection>(ss, new FooCollectionConverter());
这篇关于如何使用 Json.Net 序列化/反序列化具有附加属性的自定义集合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!