C# C Json.NET-反序列化字典

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

我用对象作为键,用浮点作为值。该值是引用一个对象而不是另一个对象的机会。 我必须使用JSON.NET-Newtonsoft将其保存在JSON中,以便以后阅读,但我找不到解决方案。 注:这不是一个游戏或一个统一的项目 我尝试过以下格式:

"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);