2013-07-12 13 views
32

文字列があり、値を取得したい。C#でJSON文字列から値を取得する方法は?

私の文字列は次のように思える:

がstring1:

"{\r\n \"id\": \"100000280905615\", 
\r\n \"name\": \"Jerard Jones\", 
\r\n \"first_name\": \"Jerard\", 
\r\n \"last_name\": \"Jones\", 
\r\n \"link\": \"https://www.facebook.com/Jerard.Jones\", 
\r\n \"username\": \"Jerard.Jones\", 
\r\n \"gender\": \"female\", 
\r\n \"locale\": \"en_US\"\r\n}" 

string2の:

"{\r\n \"id\": \"100000390001929\", 
    \r\n \"name\": \"\\u05d1\\u05d2\\u05e8\\u15dc\\u25d9 \\u05d1\\u05e8\\u05d5\\u05e9\", 
    \r\n \"first_name\": \"\\u05d4\\u05d2\\u05e7\\u02dc\\u05d9\", 
    \r\n \"last_name\": \"\\u05d1\\u05e8\\u05d5\\u05e9\", 
    \r\n \"link\": "https://www.facebook.com/people/\\u05d2\\u05d1\\[email protected]\\u05dc\\u05d9-\\u05d1\\u05e8\\u05d4\\u05e9/100000390001929\", 
    \r\n \"gender\": \"female\", 
    \r\n \"locale\": \"he_IL\"\r\n}" 

残念ながら、そこに文字列は同じ概念によるであろう状況があるが、いくつかなしパラメータ:

string3:

first_namelast_namegenderlocale
"{\r\n \"id\": \"100000390001929\", 
    \r\n \"last_name\": \"\\u05d1\\u05e8\\u05d5\\u05e9\", 
    \r\n \"gender\": \"female\", 
    \r\n \"locale\": \"he_IL\"\r\n}" 

は、どのように私はの値を得ることができますか?

+13

[JSONパーサー](https://www.google.co.uk/search?q=c%23+parse+json)が必要なようです。 – Rawling

+0

私はRegexまたはJSONライブラリを使っています。最高の賭けのようだ。 – LokiSinclair

+0

部分文字列はどうですか。 – FeliceM

答えて

67

文字列はJSON形式になっているため、をオブジェクトとして解析する必要があります。そのためにはJSON.NETを使用できます。

string source = "{\r\n \"id\": \"100000280905615\", \r\n \"name\": \"Jerard Jones\", \r\n \"first_name\": \"Jerard\", \r\n \"last_name\": \"Jones\", \r\n \"link\": \"https://www.facebook.com/Jerard.Jones\", \r\n \"username\": \"Jerard.Jones\", \r\n \"gender\": \"female\", \r\n \"locale\": \"en_US\"\r\n}"; 
dynamic data = JObject.Parse(source); 
Console.WriteLine(data.id); 
Console.WriteLine(data.first_name); 
Console.WriteLine(data.last_name); 
Console.WriteLine(data.gender); 
Console.WriteLine(data.locale); 

ハッピーコーディング:ここ

は、動的なオブジェクトにJSON文字列を解析する方法についての例です!

+6

ありがとう..私は使用しました: 動的データ= JsonConvert.DeserializeObject(要素[0]。テキスト); –

+6

「JObject」の代わりに「dynamic」の場合は+1 –

+1

これはすべて役に立ちますが、ダイナミックな文字列があるまでjsonから取得する必要があります。例:ユーザー{ID}。ユーザー名 –

5

このようなクラスを作成します。

public class Data 
{ 
    public string Id {get; set;} 
    public string Name {get; set;} 
    public string First_Name {get; set;} 
    public string Last_Name {get; set;} 
    public string Username {get; set;} 
    public string Gender {get; set;} 
    public string Locale {get; set;} 
} 

を(私は100%わからないんだけど、それが動作しない場合は、DataContractJsonSerializerのために使用[DataContract][DataMember]が必要です。)

その後JSonSerializerを作成します。

private static readonly XmlObjectSerializer Serializer = new DataContractJsonSerializer(typeof(Data)); 

とデシリアライズオブジェクト:

// convert string to stream 
byte[] byteArray = Encoding.UTF8.GetBytes(contents); 
using(var stream = new MemoryStream(byteArray)) 
{ 
    (Data)Serializer.ReadObject(stream); 
} 
+4

Json.NETはDataContractJsonSerializerよりはるかに優れています。機能の比較表を参照してください:http://json.codeplex.com/ –

+0

そしてServiceStack.TextはJSON.Netよりはるかに優れています。 – Sam

+0

私はJson.NETが好きですが、これは外部のコードがたくさんあり、理解しやすい良い答えです。 – wcm

7

次のコードは私のために働いています。

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
       { 
        using (Stream responseStream = response.GetResponseStream()) 
        { 
         using (StreamReader responseReader = new StreamReader(responseStream)) 
         { 
          string json = responseReader.ReadToEnd(); 
          string data = JObject.Parse(json)["id"].ToString(); 
         } 
        } 
       } 

//json = {"kind": "ALL", "id": "1221455", "longUrl": "NewURL"} 
関連する問題