奇怪的对象引用未设置为对象的实例?

时间:2016-02-10 16:34:20

标签: c# json

我对C#很新,我有这个代码:

downloads obj = JsonConvert.DeserializeObject<downloads>(data);

foreach (KeyValuePair<string, client> kvp in obj.client)
{
    Console.WriteLine("URL: " + kvp.Value.url);
    Console.WriteLine("SHA1: " + kvp.Value.sha1);
    matrix[0].Add(kvp.Value.url);
    matrix[0].Add(kvp.Value.sha1);
}

这些课程:

class downloads
{
    [JsonProperty("client")]
    public Dictionary<string, client> client { get; set; }
}

class client
{
    [JsonProperty("url")]
    public string url { get; set; }
    [JsonProperty("sha1")]
    public string sha1 { get; set; }
}

它说我没有将对象引用设置为对象的实例但是如何创建引用并将该引用用作类型? 我的意思是,我创建了一个对下载的引用:

downloads down = new downloads();

但是现在如何分配json反序列化的变量? 这是完整的代码: https://dotnetfiddle.net/F9mSvQ

部分JSON:

{ 
"downloads": 
  {
    "client": { "sha1": "e80d9b3bf5085002218d4be59e668bac718abbc6" },
    "server": { "sha1": "952438ac4e01b4d115c5fc38f891710c4941df29" }
   }
 }

2 个答案:

答案 0 :(得分:1)

来自JSON downloads本身应该是Client个对象上的字典,或者包含类型为Client的几个属性,如

class Downloads
{
  public Client client { get; set; }
  public Client server { get; set; }
}

调试说明:序列化你的类以查看它产生的结果总是一个好主意 - 这会让你知道结构是否匹配。

答案 1 :(得分:0)

首先,我建议你坚持使用传统的Naming Conventions

它将帮助您和其他人更好,更清晰地看到您的代码。

根据您拥有的类结构,这里是您想要的json格式。

string json = @"{clients: {
     'clientname1':{'sha1':'shahashhere','url':'urlhere'},
     'clientname2':{'sha1':'shahashhere','url':'urlhere'}
 }}";

根据需要更改值。

以下是https://dotnetfiddle.net/uedQ8i的链接。我改变了班级名称,因为我在工作时感到困惑。

修改

由于OP无法控制JSON字符串,因此必须使另一个类包含downloads对象

class MinecraftObject {
    Downloads downloads {get;set;}
}

反序列化json字符串

var obj = JsonConvert.DeserializeObject<MinecraftObject>(json);
var download = obj.downloads;