C# C Json.NET-反序列化字典
我用对象作为键,用浮点作为值。该值是引用一个对象而不是另一个对象的机会。 我必须使用JSON.NET-Newtonsoft将其保存在JSON中,以便以后阅读,但我找不到解决方案。 注:这不是一个游戏或一个统一的项目 我尝试过以下格式:C# C Json.NET-反序列化字典,c#,json,json.net,deserialization,json-deserialization,C#,Json,Json.net,Deserialization,Json Deserialization,我用对象作为键,用浮点作为值。该值是引用一个对象而不是另一个对象的机会。 我必须使用JSON.NET-Newtonsoft将其保存在JSON中,以便以后阅读,但我找不到解决方案。 注:这不是一个游戏或一个统一的项目 我尝试过以下格式: "Droppables" : [{ { "DroppableType": "LnUP", "SpriteFileName": "Projectile 1.png" }, 0.15 }, { { "Droppa
"Droppables" : [{
{
"DroppableType": "LnUP",
"SpriteFileName": "Projectile 1.png"
},
0.15
},
{
{
"DroppableType": "AnUP",
"SpriteFileName": "Projectile 2.png"
},
0.15
}]
还有很多其他的,但都不起作用。
有没有办法或者我必须使用其他结构?
谢谢。以对象作为键的字典没有Json格式的表示。您需要使用代理类型将字典转换为更合适的结构,如下所示:
public class Proxy
{
public string DroppableType { get; set; }
public string SpriteFileName { get; set; }
public float Probability { get; set; }
}
// before you serialize
var result = yourDictionary.Select(t=> new Proxy {
Probability = t.Value,
DroppableType = t.DroppableType,
SpriteFileName = t.SpriteFileName
}).ToArray();
// for deserializing it
var dictionary = deserialized.ToDictionary(r=> new YourType { r.DroppableType, r.SpriteFileName },r=>Probability);
你试过了吗?@PhilippeB。是的,我正在用。我已经在互动程序中写了,现在我也添加了问题,抱歉:@ProtoTyPus在序列化现有词典时是否尝试观察结果?您100%确定吗@ProtoTyPus 1为什么需要使用对象作为键。2使用代理类有什么问题?另外,请注意,您需要重写对象的Equals和GetHashCode方法,以使其与dictionary一致。有了这个限制,您的选择似乎是要么修改您的字典,要么扩展serialiser Newtonsoft库,它有几个点您可以插入,这样它就知道要生成什么类型的输出
"Droppables" : {
{
"DroppableType": "LnUP",
"SpriteFileName": "Projectile 1.png"
},
0.15
},
{
{
"DroppableType": "AnUP",
"SpriteFileName": "Projectile 2.png"
},
0.15
}
public class Proxy
{
public string DroppableType { get; set; }
public string SpriteFileName { get; set; }
public float Probability { get; set; }
}
// before you serialize
var result = yourDictionary.Select(t=> new Proxy {
Probability = t.Value,
DroppableType = t.DroppableType,
SpriteFileName = t.SpriteFileName
}).ToArray();
// for deserializing it
var dictionary = deserialized.ToDictionary(r=> new YourType { r.DroppableType, r.SpriteFileName },r=>Probability);