繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM