[英]How to properly convert returned JSON to C# class?
我正在使用以JSON格式返回数据的API(据我所知,这是我第一次使用真正的API或JSON)。 我读了很多有关在C#中使用JSON的知识,并最终获得了Newtonsoft.Json库。 不幸的是,我很难按照Newtonsoft文档中存在的示例将收到的响应转换为C#类。
这是此API返回的数据的示例:
{"name":{"id":1,"name":"name","pID":1,"revisionDate":1390580000000}}
到目前为止,我所拥有的是:
public class apiDataObject
{
public long id {get; set;}
public string name { get; set; }
public int pID { get; set; }
public long revisionDate { get; set; }
}
public long getID()
{
try
{
data = WebRequest.Create(baseURL);
retData = data.GetResponse().GetResponseStream();
}
catch (Exception exception)
{
outputBox.AppendText(Environment.NewLine + exception.ToString());
}
retDataReader = new StreamReader(retData);
returnedData = retDataReader.ReadToEnd();
outputBox.AppendText(returnedData);
apiDataObject test = new apiDataObject();
JsonConvert.PopulateObject(returnedData, test);
return test.id;
}
我也尝试过将JsonConvert.PopulateObject(returnedData,test)替换为:
apiDataObject test = JsonConvert.DeserializeObject<apiDataObject>(returnedData)
问题是代码完成后,我的“测试”对象始终为空。 我已经逐步完成了代码,所有工作都很好,直到到达创建测试对象并据推测已填充的行。 我还尝试了内置的Microsoft库,并遇到了完全相同的问题。 老实说,我很困惑,我花了2到3个小时来查看这几行代码以及大量的Newtonsoft.Json库文档和示例,但根本无法弄清楚我在哪里出错了。 任何帮助将不胜感激。
从您发布的JSON来看,它实际上是一个字典类型:我更改了方法以显示给您,我对其进行了测试,然后它可以工作。
public long GetID()
{
var testDict = new Dictionary<string, apiDataObject>();
var returnedData = "{\"name\":{\"id\":1,\"name\":\"name\",\"pID\":1,\"revisionDate\":1390580000000}}";
JsonConvert.PopulateObject(returnedData, testDict);
return testDict["name"].id;
}
运行原始代码会引发异常,告诉您它不知道如何处理第一个“名称”。
以防万一有人在搜索中遇到此问题,我想出了另一种解决此类数据的解决方案。 Newtonsoft.Json库包含一个名为DeserializeObject
的函数。 因此,对于以下示例数据:
{"name":{"id":1,"name":"name","pID":1,"revisionDate":1390580000000}}
您可以创建一个类似于以下内容的对象:
public class Name
{
public int id { get; set; }
public string name { get; set; }
public int pID { get; set; }
public long revisionDate { get; set; }
}
public class RootObject
{
public Name name { get; set; }
}
然后使用:
JsonConvert.DeserializeObject<RootObject>(returnedData);
无需使用字典即可将json转换为对象。
考虑到可以使用之前链接的json2csharp转换器轻松创建目标代码,因此这可能是“常识”,但是我无法找到有关何时使用DeserializeObject
函数或为什么将它与PopulateObject
一起使用的任何直接解释。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.