Fid*_*cia 5 c# json.net deserialization
我有一个对象列表 (A),每个对象都包含一个对象列表 (B)。我对 As 列表进行了序列化,没有出现任何问题,但是当我对 As 进行反序列化时,每个 A 内的 B 列表的 B 数量是原始数量的两倍。为什么会发生这种情况?
var sample = new List<A>
{
new A
{
Flag = true,
Amount = 10,
Bs = new List<B>
{
new B {Amount = 4, Id = Guid.NewGuid()},
new B {Amount = 6, Id = Guid.NewGuid()}
}
},
new A
{
Flag = true,
Amount = 20,
Bs = new List<B>
{
new B {Amount = 4, Id = Guid.NewGuid()},
new B {Amount = 6, Id = Guid.NewGuid()}
}
},
new A
{
Flag = false,
Amount = 30,
Bs = new List<B>
{
new B {Amount = 4, Id = Guid.NewGuid()},
new B {Amount = 6, Id = Guid.NewGuid()}
}
}
};
var serialized = JsonConvert.SerializeObject(sample, ContractResolver.AllMembersSettings);
var deserialized = JsonConvert.DeserializeObject<List<A>>(serialized, ContractResolver.AllMembersSettings);
Run Code Online (Sandbox Code Playgroud)
class A
{
public bool Flag { get; set; }
public decimal Amount { get; set; }
public List<B> Bs { get; set; }
}
class B
{
public Guid Id { get; set; }
public decimal Amount { get; set; }
}
public class ContractResolver : DefaultContractResolver
{
public static readonly JsonSerializerSettings AllMembersSettings =
new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All,
ContractResolver = new ContractResolver()
};
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
var props =
type
.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
.Where(p => p.CanRead && p.CanWrite)
.Select(p => base.CreateProperty(p, memberSerialization))
.Union(
type
.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
.Select(f => base.CreateProperty(f, memberSerialization)))
.ToList();
props.ForEach(p => { p.Writable = true; p.Readable = true; });
return props;
}
}
Run Code Online (Sandbox Code Playgroud)
正如我的问题中提到的,我不确定你为什么有 ContractResolver,但是当我使用以下内容时:
string sampleData = Newtonsoft.Json.JsonConvert.SerializeObject(sample);
List<A> test = Newtonsoft.Json.JsonConvert.DeserializeObject<List<A>>(sampleData);
Run Code Online (Sandbox Code Playgroud)
数据按预期进行序列化和反序列化。
| 归档时间: |
|
| 查看次数: |
2261 次 |
| 最近记录: |