如何正确地将返回的JSON转换为C#类?

时间:2014-01-25 18:00:54

标签: c# json

我正在使用以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库的样本,但根本无法弄清楚我在哪里出错了。任何帮助将不胜感激。

2 个答案:

答案 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使用。