2011-10-08 15 views
7

Poszukuję przykładowego kodu/lib, aby rozszyfrować łańcuch JSON przy użyciu C#.Jak rozszyfrować ciąg JSON przy użyciu C#?

zdekodować mogę to zrobić:

var data = new Dictionary<string,string>(); 
data.Add("..", "..."); 
var json_encoded = new JavaScriptSerializer().Serialize(data); 

ale rozszyfrować, jak to zrobić?

var json_decoded = ?? 

Dzięki!

+0

wystarczy użyć [Json.NET] (http: // james.newtonking.com/projects/json-net.aspx), możesz serializować i deserializować do dowolnego typu, który chcesz utworzyć. –

+0

możliwy duplikat [Json Deserialize C#] (http://stackoverflow.com/questions/7895105/json-deserialize-c-sharp) – nawfal

Odpowiedz

10

Można to zrobić:

var data = new Dictionary<string, string>(); 
data.Add("foo", "baa"); 

JavaScriptSerializer ser = new JavaScriptSerializer(); 
var JSONString = ser.Serialize(data); //JSON encoded 

var JSONObj = ser.Deserialize<Dictionary<string, string>>(JSONString); //JSON decoded 
Console.Write(JSONObj["foo"]); //prints: baa 
+3

Należy zauważyć, że to nie przekształca łańcucha JSON z powrotem w typ, co może być w porządku w niektórych przypadkach. Uważam, że deserializacja łańcucha do typu jest znacznie bardziej niezawodnym rozwiązaniem. –

8

To zajmie JSON i przekształcić go w silnie wpisany klasy, której można określić (T)

public static T Deserialize<T>(string json) 
     { 
      var obj = Activator.CreateInstance<T>(); 
      using(var ms = new MemoryStream(Encoding.Unicode.GetBytes(json))) 
      { 
       var serializer = new DataContractJsonSerializer(obj.GetType()); 
       obj = (T) serializer.ReadObject(ms); 
       return obj; 
      } 
     } 

to zajmie klasę i szeregować je jako JSON

public static string Serialize<T>(T obj) 
    { 
     var serializer = new DataContractJsonSerializer(obj.GetType()); 
     using (var ms = new MemoryStream()) 
     { 
      serializer.WriteObject(ms, obj); 
      return Encoding.Default.GetString(ms.ToArray()); 
     } 
    } 

Uwaga: W pierwszy przykład musisz mieć klasę zabezpieczenia, aby określić, jaki typ jest T. Więc jeśli powiedział to, że T jest typu User trzeba by mieć to gdzieś określone: ​​

public class User 
    { 
     public string Username { get; set; } 
     public string Firstname { get; set; } 
    } 
+1

Może warto skonstruować * jeden * obiekt 'DataContractJsonSerializer' (na typ szeregowy) zamiast konstruowanie nowego dla każdej serializacji? – Timwi

+0

@Timwi, to zależy. Będzie cię to kosztować więcej pamięci, aby pomieścić instancje, ale jeśli nie, to będzie to mniej ekonomiczne. To naprawdę sprowadza się do twojej konkretnej sytuacji. Najlepiej byłoby zachować serializery, które będą często używane i wyrzucać te, które nie będą. –

Powiązane problemy