【问题标题】:Parse certain data using JSON.Net使用 JSON.Net 解析某些数据
【发布时间】:2016-04-14 23:31:22
【问题描述】:

我正在尝试从我得到的一些 JSON 数据中解析某个链接,但我似乎做不到?以下是一些示例数据(来自 PayPal API):

{"id":"PAY-3YA6562986829024GK2JH7UQ","intent":"sale","state":"created","payer":{"payment_method":"paypal"},"transactions":[{"amount":{"total":"12.00","currency":"USD"},"description":"creating a payment","related_resources":[]}],"create_time":"2016-01-10T15:59:14Z","links":[{"href":"https://api.sandbox.paypal.com/v1/payments/payment/PAY-3YA6562986829024GK2JH7UQ","rel":"self","method":"GET"},{"href":"https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-5CP140577W0453458","rel":"approval_url","method":"REDIRECT"},{"href":"https://api.sandbox.paypal.com/v1/payments/payment/PAY-3YA6562986829024GK2JH7UQ/execute","rel":"execute","method":"POST"}]}

所以我尝试了以下操作:

    dynamic stuff = JsonConvert.DeserializeObject(createdPayment.ConvertToJson());
    string paymentURL = stuff.href;
    MessageBox.Show(paymentURL);

我还尝试使用Newtonsoft.Json.Linq 并将stuff.links 填充到JAraay 中,然后通过索引拉出链接,但没有成功。我使用的这个方法没有给我错误,它只是为我返回一个空白字符串?

有什么想法吗?

【问题讨论】:

    标签: c# json linq paypal


    【解决方案1】:

    问题是您的“href”链接在您的“链接”属性中,您可以像这样访问它们:

            dynamic stuff = JsonConvert.DeserializeObject(json);
    
            foreach (var item in stuff.links)
            {
                MessageBox.Show(item.href);
            }
    

    编辑:添加了获取链接列表的示例

            dynamic stuff = JsonConvert.DeserializeObject(json);
            var links = new List<string>();
            foreach (var item in stuff.links)
            {            
                links.Add((string)item.href);
            }
    

    【讨论】:

    • Additional information: The best overloaded method match for 'System.Windows.Forms.MessageBox.Show(string)' has some invalid arguments 我不认为你的意思是 item.href?我想你的意思是item?无论如何,我都尝试了相同的错误:(。
    • 嗯,然后试试这个:MessageBox.Show((string)item.href);或者这个:MessageBox.Show(item.href.ToString());我给你的例子在控制台应用程序中为我工作。 :)
    • 好的,行得通!它返回给我 JSON 字符串中的每个 href,现在问题我如何获得第二个或 [1] 索引?我试图将其添加到列表中但没有运气? ` 列表 hreflist = 新列表(); hreflist.Add((string)item.href); MessageBox.Show(hreflist[1]);` 似乎 [0] 包含 JSON 字符串中列出的所有三个链接?谢谢你!
    • 没问题。我添加了另一个将链接放入列表的示例,它可以在我的机器上运行。
    【解决方案2】:

    你应该创建一个类来保存你想要从 JSON 字符串中获取的值。

    该类将如下所示:

    public class Payer
    {
        public string payment_method { get; set; }
    }
    
    public class Amount
    {
        public string total { get; set; }
        public string currency { get; set; }
    }
    
    public class Transaction
    {
        public Amount amount { get; set; }
        public string description { get; set; }
        public List<object> related_resources { get; set; }
    }
    
    public class Link
    {
        public string href { get; set; }
        public string rel { get; set; }
        public string method { get; set; }
    }
    
    public class RootObject
    {
        public string id { get; set; }
        public string intent { get; set; }
        public string state { get; set; }
        public Payer payer { get; set; }
        public List<Transaction> transactions { get; set; }
        public string create_time { get; set; }
        public List<Link> links { get; set; }
    }
    

    然后你将能够做这样的事情(使用 Newtonsoft):

    var object = JsonConvert.DeserializeObject<RootObject>(jsonstring);
    

    然后您将能够遍历 List&lt;Link&gt; links 对象并从那里获取 href 值。

    【讨论】:

    • 我尝试这样做,然后创建一个List&lt;Links&gt; list = new List&lt;&lt;Links&gt;(),然后继续将o(即var o= JsonConvert.DeserializeObject&lt;Links&gt;(createdPayment.ConvertToJson());)添加到列表中,然后尝试执行MessageBox.Show(list[0].href);,并给了我一个空白字符串.
    【解决方案3】:

    如果您需要解析数据,那么您可以简单地尝试这个示例控制台应用程序。更多信息请访问Newtonsoft api reference

    class Program
    {
        class HrefResult
        {
            public string Href { get; set; }
            public string Rel { get; set; }
            public string Method { get; set; }
        }
    
        static void Main(string[] args)
        {
            String createdPayment = @"{""id"":""PAY - 3YA6562986829024GK2JH7UQ"",""intent"":""sale"",""state"":""created"",""payer"":{""payment_method"":""paypal""},""transactions"":[{""amount"":{""total"":""12.00"",""currency"":""USD""},""description"":""creating a payment"",""related_resources"":[]}],""create_time"":""2016 - 01 - 10T15: 59:14Z"",""links"":[{""href"":""https://api.sandbox.paypal.com/v1/payments/payment/PAY-3YA6562986829024GK2JH7UQ"",""rel"":""self"",""method"":""GET""},{""href"":""https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-5CP140577W0453458"",""rel"":""approval_url"",""method"":""REDIRECT""},{""href"":""https://api.sandbox.paypal.com/v1/payments/payment/PAY-3YA6562986829024GK2JH7UQ/execute"",""rel"":""execute"",""method"":""POST""}]}";
    
            JObject stuff = JObject.Parse(createdPayment);
            IList<Newtonsoft.Json.Linq.JToken> results = stuff["links"].Children().ToList();
    
            IList<HrefResult> hrefResults = new List<HrefResult>();
            foreach (JToken result in results)
            {
                HrefResult hrefResult = Newtonsoft.Json.JsonConvert.DeserializeObject<HrefResult>(result.ToString());
                hrefResults.Add(hrefResult);
            }
    
            foreach(var elem in hrefResults) Console.WriteLine("{0}", elem.Href);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-15
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      • 2010-09-28
      • 1970-01-01
      相关资源
      最近更新 更多