2012-12-05 9 views
6

Czuje się jak tam jest jedno rozwiązanie dwóch rząd za to, co chcę zrobić: Analizować ciąg tak:przeanalizować ten json ciąg do tablicy ciągów C#

"{\"postalcode\":\"12345\",\"postalcity\":\"SOME-CITY\",\"country\":\"UK\",\"box\":false}" 

Into coś takiego:

string[] result = { "12345", "SOME-CITY", "UK", "false" }; 

Jaki jest najprostszy sposób to zrobić?

Odpowiedz

18
string json = "{\"postalcode\":\"12345\",\"postalcity\":\"SOME-CITY\",\"country\":\"UK\",\"box\":false}"; 

var dict = new JavaScriptSerializer().Deserialize<Dictionary<string,object>>(json); 
var postalCode = dict["postalcode"]; 

//Array is also possible 
string[] result = dict.Select(kv => kv.Value.ToString()).ToArray(); 
+0

Witam .. ta metoda zgłasza wyjątek podczas próby deserializacji łańcucha JSON zawierającego wiele obiektów. Czy istnieje sposób, aby to rozwiązać? – Rajesh

+0

proszę zignorować mój komentarz powyżej, JavaScriptSerializer(). Metoda DeserializeObject() wydaje się działać dobrze. – Rajesh

+0

Awesome. :) szybka i schludna :) "+1" ode mnie. – sebastian

2

Można użyć JavaScriptSerializer do przekształcenia json w obiekt dynamic, który umożliwi dostęp do właściwości za pośrednictwem nazwy, np.

var address = new JavaScriptSerializer().Deserialize<dynamic>(json); 
Console.WriteLine(address["postalcode"]); 
5

Można również użyć newtonsoft: http://james.newtonking.com/pages/json-net.aspx

string json = @"{ 
    ""Name"": ""Apple"", 
    ""Expiry"": new Date(1230422400000), 
    ""Price"": 3.99, 
    ""Sizes"": [ 
    ""Small"", 
    ""Medium"", 
    ""Large"" 
    ] 
}"; 

JObject o = JObject.Parse(json); 

string name = (string)o["Name"]; 
// Apple 

JArray sizes = (JArray)o["Sizes"]; 

string smallest = (string)sizes[0]; 
// Small 

znalazłem innego związanego wpis: JSON to string array in C#
Lib: http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx

2

To wygląda jak ciąg wejściowy jest ciągiem JSON, na które możesz użyć deserializatora JSON, jeśli chcesz. Jeśli nie można użyć wyrażeń regularnych wraz z wymienionych grup jak:

List<string> values = new List<string>(); 
List<string> keys= new List<string>(); 

string pattern = @"\""(?<key>[^\""]+)\""\:\""?(?<value>[^\"",}]+)\""?\,?"; 
foreach(Match m in Regex.Matches(input, pattern)) 
{ 
    if (m.Success) 
    { 
     values.Add(m.Groups["value"].Value); 
     keys.Add(m.Groups["key"].Value); 
    } 
} 

var result = values.ToArray(); 

grup wymienionych w regularnych ekspresji są oznaczone (?<group-name>pattern). W powyższym wzorze mamy dwie nazwane grupy: key i value, które można pobrać z obiektu Match za pomocą indeksera Groups.