繁体   English   中英

在C#中为来自Salesforce REST API的嵌套JSON数据设置DataContract

[英]Setting up DataContract in C# for nested JSON data from Salesforce REST API

我需要帮助弄清楚如何将JSON数据获取到从Salesforce REST API获取数据的C#应用​​程序中。

首先,我有一些看起来像这样的JSON数据:

{
  "attributes" : {
    "type" : "Object__c",
    "url" : "/services/data/v34.0/sobjects/Object__c/a0FF000000CaEggEMA"
  },
  "Id" : "a0FF000000CaEggEMA",
  "Advertising__c" : 1720.0
}

而且我能够使用DataContract创建一个类,如下所示:

using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

namespace MyNamespace

{
    [DataContract]
    public class Response
    {
        [DataMember(Name = "Advertising__c")]
        public decimal decAdvertising { get; set; }
    }

}

而且,我能够使用以下代码将数据放入程序并访问数据...

public static Response MakeRequest(string requestUrl)
{
    try
    {
        HttpWebRequest request = WebRequest.Create(requestUrl) as HttpWebRequest;
        request.Headers["X-PrettyPrint"] = "1";
        request.Headers["Authorization"] = "OAuth [OAuthKeyGoesHere]";
        using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
        {
            if (response.StatusCode != HttpStatusCode.OK)
                throw new Exception(String.Format(
                "Server error (HTTP {0}: {1}).",
                response.StatusCode,
                response.StatusDescription));
            DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Response));
            object objResponse = jsonSerializer.ReadObject(response.GetResponseStream());
            Response jsonResponse = objResponse as Response;
            return jsonResponse;
        }
    }
    catch (Exception e)
    {
        System.Windows.Forms.MessageBox.Show(e.Message);
        return null;
    }
}

但是,在上面的示例中,每个JSON响应只有一个Id和一个Advertising__c 因此,DataContract似乎运行良好。

现在我想做的是从以下JSON获取项目的集合/列表/数组(我可以迭代的任何内容):

{
  "totalSize" : 4,
  "done" : true,
  "nextRecordsUrl" : "/services/data/v34.0/query/a1gF000003uAsG6IaO-2000",
  "records" : [ {
    "attributes" : {
      "type" : "Object__c",
      "url" : "/services/data/v34.0/sobjects/Object__c/a0FF000000FdAc6MAD"
    },
    "Id" : "a0FF000000FdAc6MAD",
    "Name" : "Name 1"
  }, {
    "attributes" : {
      "type" : "Object__c",
      "url" : "/services/data/v34.0/sobjects/Object__c/a0FF000000lkUJMATg"
    },
    "Id" : "a0FF000000lkUJMATg",
    "Name" : "Name 2"
  }, {
    "attributes" : {
      "type" : "Object__c",
      "url" : "/services/data/v34.0/sobjects/Object__c/a0FF000000CHaPkkMA"
    },
    "Id" : "a0FF000000CHaPkkMA",
    "Name" : "Name 3"
  }, {
    "attributes" : {
      "type" : "Object__c",
      "url" : "/services/data/v34.0/sobjects/Object__c/a0FF000000CIoiUZMA"
    },
    "Id" : "a0FF000000CIoiUZMA",
    "Name" : "Name 4"
  } ]
}

我尝试将以下代码添加到DataContract类:

[DataContract]
public class Response2
{
    [DataMember(Name = "records")]
    public Response3 r3entry;
}
[DataContract]
public class Response3
{
    [DataMember(Name = "Id")]
    public string strId { get; set; }
    [DataMember(Name = "Name")]
    public string strName { get; set; }
}

现在我两个字段都为NULLs 实际上,实际上我需要done字段,因此我知道是否返回并获取另一批数据。

在理想的情况下,我想获得某种集合/列表/数组以进行迭代并获取strId ,然后将该strId反馈回顶部的代码中以获取每个条目的详细信息。

这里有什么帮助吗?

您的Response2类应如下所示:

public class Response2
{
    [DataMember(Name = "done")]
    public bool done;
    [DataMember(Name = "records")]
    public List<Response3> r3entry;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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