是否可以使用以下格式的DataContractJsonSerializer将.Net Dictionary <Key,Value>序列化为JSON :
{
key0:value0,
key1:value1,
...
}
Run Code Online (Sandbox Code Playgroud)
我使用Dictionary <K,V>,因为没有预定义的输入结构.
我对DataContractJsonSerializer结果感兴趣!我已经找到了一个"Surrogate"示例,但输出中还有一个"数据",如果字典<K,String>,则转义也是假的.
我找到了解决方案,需要什么!首先,一个可序列化的"字典"类:(当然,这个示例只是以一种方式工作,但我不需要反序列化)
[Serializable]
public class MyJsonDictionary<K, V> : ISerializable {
Dictionary<K, V> dict = new Dictionary<K, V>();
public MyJsonDictionary() { }
protected MyJsonDictionary( SerializationInfo info, StreamingContext context ) {
throw new NotImplementedException();
}
public void GetObjectData( SerializationInfo info, StreamingContext context ) {
foreach( K key in dict.Keys ) {
info.AddValue( key.ToString(), dict[ key ] );
}
}
public void Add( K key, V value ) …Run Code Online (Sandbox Code Playgroud) 每当我尝试序列化字典时,我都会得到异常:
System.ArgumentException: Type
'System.Collections.Generic.Dictionary`2[[Foo.DictionarySerializationTest+TestEnum, Foo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'
is not supported for serialization/deserialization of a dictionary,
keys must be strings or object
Run Code Online (Sandbox Code Playgroud)
我的测试用例是:
public class DictionarySerializationTest
{
public enum TestEnum { A, B, C }
//tried with numbers, too: public enum TestEnum { A = 1, B = 2, C = 3 }
public void SerializationTest()
{
Dictionary<TestEnum, Int32> data = new Dictionary<TestEnum, Int32>();
data.Add(TestEnum.A, 1);
data.Add(TestEnum.B, 2);
data.Add(TestEnum.C, 3);
JavaScriptSerializer serializer = new JavaScriptSerializer();
String …Run Code Online (Sandbox Code Playgroud) 我试图将Dictionary序列化为JSON,并获得以下异常:
new JavaScriptSerializer().Serialize(mydict)`
Run Code Online (Sandbox Code Playgroud)
键入'System.Collections.Generic.Dictionary`2 [[System.UInt64,mscorlib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089],[System.Nullable .1 [[System.UInt64,mscorlib,Version =字典的序列化/反序列化不支持2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]],mscorlib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]',键必须是字符串或对象.
是否有捷径可寻?也许通过LINQ或者相对简洁的东西将ulongs转换为字符串?
我有一个字典对象,如下所示。
Dictionary<string, Dictionary<int, List<DataRow>>> lineList = new Dictionary<string, Dictionary<int, List<DataRow>>>();
Run Code Online (Sandbox Code Playgroud)
我想将此对象转换为 Json 字符串,但是当我使用以下代码时,它只考虑字典列表中的第一个对象,然后在其中添加其余数据,而不管它连接的是哪个键。
var linechartString = JsonConvert.SerializeObject(lineList);
Run Code Online (Sandbox Code Playgroud)
我想知道是否有不同的函数可以将我的字典对象转换为 JSON 字符串。
我有一个当前从 Dictionary 继承的类,然后向其中添加了一些第一类成员属性。大致:
public class Foo : Dictionary<string, string>
{
public string Bar { get; set; }
public string Baz { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然而,将此对象的实例序列化为 JSON 后,序列化程序似乎只发出我存储在字典中的键/值对。即使我将 DataMember 属性应用于新的第一类属性,JSON 序列化程序似乎也不知道如何处理这些属性,而是忽略它们。
我假设我缺少一些基本的基本知识,但是在 .net 的 JSON 序列化器上搜索代码示例和文档时,我只发现了一些与我正在做的事情不太匹配的琐碎示例。我们从其他基类派生的所有其他类似乎都没有表现出这个问题,特别是从通用字典派生的这个类让我们感到不舒服。
[编辑] 除了将字典作为一流属性移入 Foo 之外,还有什么办法可以实现这一点吗?我假设挂断是序列化器不知道如何“命名”字典以将其与其他成员区分开来?
我是C#开发的新手,
在我的项目中,我尝试Dictionary通过Settings使用以下代码将其序列化为存储来保存实例:
private static Dictionary<string, Dictionary<int, string>> GetKeys()
{
Dictionary<string, Dictionary<int, string>> keys = null;
try {
JavaScriptSerializer ser = new JavaScriptSerializer();
keys = ser.Deserialize<Dictionary<string, Dictionary<int, string>>>(Settings.Default.keys);
}
catch (Exception e)
{
Debug.Print(e.Message);
}
return keys;
}
private static void SetKeys(Dictionary<string, Dictionary<int, string>> keys)
{
try
{
JavaScriptSerializer ser = new JavaScriptSerializer();
Settings.Default.keys = ser.Serialize(keys);
}
catch (Exception e)
{
Debug.Print(e.Message);
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试调用SetKeys方法时,会出现问题.A ThreadAbortException抛出:
mscorlib.dll中发生了'System.Threading.ThreadAbortException'类型的第一次机会异常需要一个线程暂时运行.使用"监视"窗口执行评估.
您是否知道如何解决我的错误?
谢谢
您如何使用JavaScriptSerializer和自定义JavaScriptConverter序列化和反序列化其键为JSON 整数的字典?
对于那些不知道的人,JavaScripSerializer无法开箱即用.
请注意,我对需要在序列化之前转换字典或使用其他序列化程序的解决方案感兴趣(如果有的话,您可能会看到此帖子).
更新:为了消除任何歧义,我没有问题,密钥是作为JSON中的字符串生成的(因此1将变为"1").