【问题标题】:Serializing a Dictionary<> object with DataContractJsonSerializer使用 DataContractJsonSerializer 序列化 Dictionary<> 对象
【发布时间】:2012-11-24 20:25:49
【问题描述】:

我有以下Dictionary&lt;&gt; 对象:

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 运行时。

【问题讨论】:

  • Mike string json = JsonConvert.SerializeObject(parameters); 完全符合您的要求,据此page 它支持 Silverlight、windows 手机和 winRT。
  • 如我所说,我不能使用第三方库。

标签: c# .net json silverlight serialization


【解决方案1】:

尝试序列化这个

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

【讨论】:

  • DataContractJsonSerializer 基本上坏了。这种方法听起来很理智。如果可能(我不知道 win8)使用 JavascriptSerializer,唯一的优点是它能够序列化字典。
  • 同意关于 JavaScriptSerializer 的看法
  • @faester - 不幸的是,JavaScriptSerializer 在 Silverlight 框架中不可用。
  • @karaxuna - 这是一个不错的方法,但是我的班级目前有一个 AddParameter(string, object) 方法来添加参数。我可以更改方法以一次获取所有参数,但是我不相信您可以将匿名类型传递给方法。
  • 我实际上只是为所有各种类型的参数编写代理对象,尽管这将是更多的代码,但我认为这种方法可能是最好的方法,如果我真的很想让这个工作。谢谢!
【解决方案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 查询将使用 Helper 类将 JSON 属性作为 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}]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多