我正在使用以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)
问题是代码完成后我的“test”对象总是空的。我已经逐步完成了代码,一切都运行良好,直到我到达创建测试对象的行,并且据说已填充。我也尝试过内置的Microsoft库,并且遇到了完全相同的问题。我老老实实地感到困惑,我花了2到3个小时来查看这几行代码和大量的文档以及Newtonsoft.Json库的样本,但根本无法弄清楚我在哪里出错了。任何帮助将不胜感激。
答案 0 :(得分:1)
从你发布的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;
}
运行原始代码会抛出异常,告诉您它不知道如何处理第一个“名称”。
答案 1 :(得分:0)
万一有人在搜索中遇到过这种情况,我想出了另一种处理此类数据的解决方案。 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
使用。