代码之家  ›  专栏  ›  技术社区  ›  lukas

C#将字符串转换为字典

  •  7
  • lukas  · 技术社区  · 12 年前

    我从 Bitly 应用程序编程接口:

    { "status_code": 200,
      "status_txt": "OK",
      "data":
        { "long_url": "http:\/\/amazon.de\/",
          "url": "http:\/\/amzn.to\/1mP2o58",
          "hash": "1mP2o58",
          "global_hash": "OjQAE",
          "new_hash": 0
        }
    }
    

    如何将此字符串转换为字典,以及如何访问键的值 "url" (没有所有 \ )

    4 回复  |  直到 12 年前
        1
  •  10
  •   Avner Shahar-Kashtan    12 年前

    这不仅仅是一些普通的字符串。这是中的数据结构 JSON 格式,一种常见且成熟的格式,最初在Javascript中使用,但现在作为服务和客户端之间的数据传输机制相当常见。

    我建议您使用现有的C#JSON库,而不是自己重新发明轮子并解析JSON,例如 JSON.NET ,它将吃掉该字符串并将其解析为.NET对象。

    下面是一个代码示例,取自JSON.NET的文档,显示了它的用法:

    string json = @"{
    'href': '/account/login.aspx',
    'target': '_blank'
     }";
    
    Dictionary<string, string> htmlAttributes =                 
     JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
    
    Console.WriteLine(htmlAttributes["href"]);
       // /account/login.aspx
    
    Console.WriteLine(htmlAttributes["target"]);
       // _blank
    
        2
  •  5
  •   lukas    12 年前

    如果将Newtonsoft的Json这样的包添加到项目中,则可以将Json反序列化为匿名类型。然后可以从中获取url。这可通过Visual Studio中的NuGet获得,并支持异步或同步序列化/反序列化。

    public string GetUrl(string bitlyResponse)
    {
        var responseObject = new
        {
            data = new { url = string.Empty },
        };
    
        responseObject = JsonConvert.DeserializeAnonymousType(bitlyResponse, responseObject);
        return responseObject.data.url;
    }
    
        3
  •  1
  •   deadwards    12 年前

    我会使用JSON.NET。

    http://james.newtonking.com/json

    麻省理工学院许可证,这意味着如果你在做任何商业活动,你都是好的。

    我认为你不想直接去读字典,因为那里有些东西不是一对一的关系。所以你可以做一个如下的课程。

    public class BitlyData
    {
        public string LongUrl{ get; set; }
        public string Url { get; set; }
        public string Hash { get; set; }
        public string GlobalHash { get; set; }
        public string NewHash { get; set; }
    }
    

    然后可以使用Json.NET将该字符串转换为JObject。所以我们将您的字符串称为bitlyString。

    JObject bitlyObject = JObject.Parse(bitlyString);
    

    现在我们只剩下访问数据了。

    BitlyData theData = JsonConvert.DeserializeObject<BitlyData>(bitlyObject["data"]);
    

    然后,您可以使用getter访问url(以及任何其他片段)。

    当然,通过让类也处理其他位,你可以做得更好,所以你只需要做一次串行化。

        4
  •  1
  •   George Vovos    12 年前

    1) 将这些类添加到项目中

    public class Rootobject
    {
        public int status_code { get; set; }
        public string status_txt { get; set; }
        public Data data { get; set; }
    }
    
    public class Data
    {
        public string long_url { get; set; }
        public string url { get; set; }
        public string hash { get; set; }
        public string global_hash { get; set; }
        public int new_hash { get; set; }
    }
    

    2) 添加对JSON.NET的引用

    3)

       string jsonString= "YOUR JSON STRING";
       Rootobject weps = JsonConvert.DeserializeObject<Rootobject>(jsonString);
    
       Console.WriteLine(weps.status_code);
       if (weps.data != null)
       {
            Console.WriteLine(weps.data.url);
            Console.WriteLine(weps.data.global_hash);
            //...
       }