2012-11-24 68 views
4

我有以下Dictionary<>對象:序列化詞典<>對象與DataContractJsonSerializer

Dictionary<String, object> parameters = new Dictionary<string, object>(); 
parameters.Add("username", "mike"); 
parameters.Add("password", "secret"); 
parameters.Add("persist", false); 

當我把它序列化:

using (MemoryStream stream = new MemoryStream()) 
{ 
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(parameters.GetType()); 
    serializer.WriteObject(stream, parameters); 

    byte[] bytes = stream.ToArray(); 
    string json = Encoding.UTF8.GetString(bytes, 0, bytes.Length); 

    return json; 
} 

我得到如下:

"[{\"Key\":\"username\",\"Value\":\"mike\"},{\"Key\":\"password\",\"Value\":\"secret\"},{\"Key\":\"persist\",\"Value\":false}]" 

什麼我想得到的是一個原始的鍵/值對映射,如下所示:

"{\"username\":\"mike\", \"password\":\"secret\", \"persist\": false}" 

我試着將UseSimpleDictionaryFormat設置爲true,但是這個屬性沒有任何作用,也沒有將它的用途記錄在我能找到的任何地方。

我不能使用自定義類,因爲參數鍵/值對在編譯時是未知的。

我也不能使用第三方庫,比如JSon.NET。我正在使用Silverlight框架和Windows Phone 8運行時。

+1

邁克'字符串JSON = JsonConvert.SerializeObject(參數);'你想要做什麼,並根據此[頁碼](http://json.codeplex.com /)它支持Silverlight,Windows Phone和winRT。 –

+0

正如我所說,我不能使用第三方庫。 –

回答

2

嘗試序列化這個

var parameters = new 
{ 
    username = "mike", 
    password = "secret", 
    persist = false 
} 
+1

DataContractJsonSerializer基本上已損壞。這種做法聽起來很健全;如果可能的話(我不知道win8)使用JavascriptSerializer,它的優點是它能夠序列化字典。 – faester

+0

贊同有關JavaScriptSerializer的故障排除器 – karaxuna

+1

@faester - 不幸的是,'JavaScriptSerializer'在Silverlight框架中不可用。 –

2

添加System.Json作爲參考後,使用這個助手類來構建JSON屬性:

public static class JsonHelper 
{ 
    public static KeyValuePair<string, JsonValue> CreateProperty(string name, dynamic value) 
    { 
     return new KeyValuePair<string, JsonValue>(name, new JsonPrimitive(value)); 
    } 
} 

下面的LINQ查詢將動態返回JSON性質作爲使用Helper類的JsonArray。

var result = from item in parameters 
      select new JsonObject(JsonHelper.CreateProperty(item.Key, item.Value)); 

string json = (new JsonArray(result)).ToString(); 

結果:

[{\"username\":\"mike\"},{\"password\":\"secret\"},{\"persist\":false}] 
相關問題