将字符串转换为字典的C#方法

7

我从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" 的值(不包括所有的 \


3
使用Newtonsoft JSON库。 - Enigmativity
4个回答

10

这不仅仅是一个普通的字符串。这是一个用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

5
如果您在项目中添加类似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;
}

1
我会使用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(以及其他部分)。

当然,您可以通过拥有处理其他相关内容的类来使其更加完善,这样您只需进行一次序列化操作。


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

1
如果他只需要URL,那么创建多个类来获取数据有点过度设计,当你可以使用匿名类型时。 - Johnathon Sullinger
1
谢谢,我从未使用过DeserializeAnonymousType。 - George Vovos
当从多个REST响应中获取特定值时,它可以拯救生命。 - Johnathon Sullinger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接