把字符串转换成JSON C#

问题描述:

我有这个示例代码,我正在与。 json是http post的结果。把字符串转换成JSON C#

var json = @"{'user': { 
         'country':'US', 
         'email':'[email protected]', 
         'first_name':'Test', 
         'last_name':'API', 
         'phone':null, 
         'zip':null, 
         'login_url':'https://new.site.com/xlogin/12325/abd9832cd92' 
         } 
        }"; 
     var jsonSerializer = new JavaScriptSerializer(); 
     var itemsList = (IDictionary<string, object>)jsonSerializer.DeserializeObject(json); 
     var url = itemsList["user.login_url"]; 

itemsList["user.login_url"]我收到以下错误:

The given key was not present in the dictionary. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary. 

Source Error: 


Line 545:  var jsonSerializer = new JavaScriptSerializer(); 
Line 546:  var itemsList = (IDictionary<string, object>)jsonSerializer.DeserializeObject(json); 
Line 547:  var url = itemsList["user.login_url"]; 
Line 548: } 
Line 549: 

我在这里干什么什么了吗?我应该如何访问这个对象的名字,姓氏和网址等? enter image description here

或者,我该如何将此结果绑定到具有以下属性的类?我只需要一个指向一个好资源的指针。

public class User 
{ 
    public string Country { get; set; } 
    public string Email { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Phone { get; set; } 
    public string Zip { get; set; } 
    public string LoginUrl { get; set; } 
} 

谢谢。

+0

您隐藏您的网址在IMG但留在代码 - 'LOGIN_URL':'HTTPS://new.site.com/xlogin/12325/abd9832cd92' – Vladimirs 2014-10-31 14:25:16

+1

json中的url是错误的,这就是为什么我把它留在那里。 – 2014-10-31 14:27:19

“user.login_url”是你期望在JavaScript中使用属性路径...尝试访问字典键,而不是

var user = itemsList["user"] as IDictionary<string,object>; 
var url = user["login_url"] as string; 
+0

这导致无法使用[]对'object'类型的表达式应用索引 – 2014-10-31 14:29:21

+0

修复了代码 - 我没有从用户键转换为IDictionary – Stu 2014-10-31 14:33:46

+0

这对我有用。由于另一端我处于紧张的最后期限,因此我会继续这样做,并提高它的效率。我将把这个标记为答案。稍后我会看看json.net,并尝试这样做。 – 2014-10-31 14:40:48

尝试使用http://json.net/它会给你的类型的字典你想要..

+0

这不回答问题。 – mason 2014-10-31 14:36:11

+0

@mason如果他使用这个库,他不会面临这个问题。库本身把结果放在一个字典中,他将能够访问字典中的值(这基本上是更好/更快的方式来读/写JSON) – 2014-10-31 14:40:59

+0

我知道JSON.NET是什么以及它是如何作品。但是,如果有人问你如何盖房子,你不会说“这是一把锤子,它会做你想做的。”只需提示该工具是不够的,您需要解释* how *如何使用该工具。即使他按照你的建议切换到了JSON.NET,他可能会使用'itemsList [“user.login_url”]'不正确的语法,除非你解释不正确。 – mason 2014-10-31 14:42:47

itemsList [“user”]包含第二个词典。所以你可以导航到login_url变量使用

var user = (IDictionary<string, object>)itemsList["user"]; 
var login_url = user["login_url"]; 

嗯,我真的不明白为什么你用IDictionary来解析json对象。

  1. 使用Newtonsoft.Json而不是jsonSerializer来使用更多的文章。
  2. 继续http://json2csharp.com/并生成你的类来定义你的json(复制json和结果是C#类)。

现在配合你的JSON新RootObject不是用户:

using System; 
using Newtonsoft.Json; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var json = @"{'user': { 
         'country':'US', 
         'email':'[email protected]', 
         'first_name':'Test', 
         'last_name':'API', 
         'phone':null, 
         'zip':null, 
         'login_url':'https://new.site.com/xlogin/12325/abd9832cd92' 
         } 
        }"; 

      RootObject userObj = JsonConvert.DeserializeObject<RootObject>(json.ToString()); 

     } 
    } 


    //generated with http://json2csharp.com/ 
    public class User 
    { 
     public string country { get; set; } 
     public string email { get; set; } 
     public string first_name { get; set; } 
     public string last_name { get; set; } 
     public object phone { get; set; } 
     public object zip { get; set; } 
     public string login_url { get; set; } 
    } 

    public class RootObject 
    { 
     public User user { get; set; } 
    } 
} 
+0

不错,我会看看它,但在这个时候,我已经前进到这个项目的第二部分......这需要尽快交付。 – 2014-10-31 14:51:43