【问题标题】:C# convert string to dictionaryC#将字符串转换为字典
【发布时间】:2014-09-02 20:02:16
【问题描述】:

我从Bitly api 得到这个响应字符串:

{ "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" 的值(没有所有 \)

【问题讨论】:

  • 使用 Newtonsoft JSON 库。

标签: c# string dictionary system.net


【解决方案1】:

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

与其重新发明轮子并自己解析 JSON,我建议您使用现有的 C# 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】:

    如果您在项目中添加像 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】:

      我会使用 JSON.NET。

      http://james.newtonking.com/json

      MIT 许可证,这意味着如果您在做任何商业活动,那么您就很好。

      我不认为你会想直接去字典,因为那里有些东西不是一对一的关系。所以你可以像下面这样创建一个类。

      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)将这些类添加到您的项目中

        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);
                //...
           }
        

        【讨论】:

        • 如果他只需要 url,那么当你可以使用匿名类型时,创建多个类来获取数据有点矫枉过正
        • 谢谢,我从未使用过 DeserializeAnonymousType
        • 从多个休息响应中获取特定值时,这是一个救命稻草。
        猜你喜欢
        • 1970-01-01
        • 2012-09-07
        • 1970-01-01
        • 2021-07-25
        • 1970-01-01
        相关资源
        最近更新 更多