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

如何正确地将返回的JSON转换为C#类?,c#,json,C#,Json,我正在使用一个以JSON格式返回数据的API(据我所知,这是我第一次使用真正的API或JSON)。我读了很多关于在C#中使用JSON的文章,最终得到了Newtonsoft.JSON库。不幸的是,我很难按照Newtonsoft文档中的示例将收到的响应转换为C类 以下是此API返回的数据示例: {"name":{"id":1,"name":"name","pID":1,"revisionDate":1390580000000}} 到目前为止,我所掌握的情况如下: public class apiD

我正在使用一个以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(returnedData)

问题是我的“测试”对象在代码完成后总是空的。我已经完成了代码的编写,所有的工作都非常顺利,直到我到达了创建测试对象并假定填充测试对象的行。我还尝试了内置的Microsoft库,遇到了完全相同的问题。老实说,我被难住了,我花了两三个小时看了这几行代码、大量的文档和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;
    }
public long GetID()
{
var testDict=新字典();
var returnedData=“{\'name\':{\'id\':1,\'name\':\'name\',\'pID\':1,\'revisionDate\':139058000000}”;
JsonConvert.PopulateObject(返回数据,testDict);
返回testDict[“name”].id;
}

运行原始代码会引发一个异常,告诉您它不知道如何处理第一个“名称”。

为了防止任何人在搜索中遇到此问题,我还找到了处理此类数据的替代解决方案。Json库包含一个名为
反序列化对象
的函数。因此,对于以下样本数据:

{"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);
JsonConvert.DeserializeObject(返回数据);
无需使用字典即可将json转换为对象


这可能是“常识”,考虑到可以使用前面链接的JSON2Charp转换器轻松创建目标代码,但我找不到任何关于何时使用
反序列化对象
函数或为什么应该使用它与
PopulateObject
的直接解释

您可以粘贴returnedData的示例性内容吗?如果返回的数据是{“id”:1,“name”:“name”,“pID”:1,“revisionDate”:139058000000}它应该可以工作,请尝试传递它,您确实应该使用
PascalCase
而不是
camelCase
作为方法名和类名。有关更多信息,请确定,该示例是问题中的第一行代码,我正在将返回的数据写入
输出框
,因此我看到它返回。读取流后,数据的格式与此完全相同:
{“name”:{“id”:1,“name”:“name”,“pID”:1,“revisionDate”:139058000000}
。因此,我认为我正确地获取了数据,并且正确地读取了流,但是它没有被转储到
test
对象中。那么直接反序列化到apiDataObject肯定不会起作用。您应该尝试将其反序列化到类型为Awesome的字典中!这很有效。非常感谢您提供的示例,上面的评论讨论了这一点,但是看到一个示例真的很有帮助,因为我不熟悉Json。我对返回的数据进行了一些处理,可以准确地看到现在发生了什么。再次感谢!在抛出异常时对其进行调查确实有助于处理数据,幸运的是,JSON.Net lib很好地告诉了您这个问题。很高兴这个例子帮助你看清楚了!我的想法也是这样。当然,但在这种情况下,我编写的代码在使用返回的数据之前不会返回异常,然后它是HTTP 404,因为我传递给下一个端点的ID是0,不是合法值。为了可读性,我清理了这里发布的代码,但我可能应该在发布之前将一些测试数据转储到其中,我的错。
JsonConvert.DeserializeObject<RootObject>(returnedData);