Answers:
序列化仅包含数字或布尔值的数据结构非常简单。如果没有太多要序列化的内容,则可以为您的特定类型编写一个方法。
对于Dictionary<int, List<int>>
您指定的a,可以使用Linq:
string MyDictionaryToJson(Dictionary<int, List<int>> dict)
{
var entries = dict.Select(d =>
string.Format("\"{0}\": [{1}]", d.Key, string.Join(",", d.Value)));
return "{" + string.Join(",", entries) + "}";
}
但是,如果您要序列化几个不同的类,或更复杂的数据结构,或者特别是如果您的数据包含字符串值,则最好使用声誉卓著的JSON库,该库已经知道如何处理转义符和换行符。 Json.NET是一个流行的选项。
Json.NET现在可能已经适当地序列化了C#字典,但是当OP最初发布此问题时,许多MVC开发人员可能一直在使用JavaScriptSerializer类,因为这是开箱即用的默认选项。
如果你工作在一个传统项目(MVC 1或MVC 2),并且不能使用Json.NET,我建议你使用List<KeyValuePair<K,V>>
,而不是一个Dictionary<K,V>>
。遗留的JavaScriptSerializer类可以很好地序列化此类型,但是它在字典方面会遇到问题。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization.Json;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Dictionary<int, List<int>> foo = new Dictionary<int, List<int>>();
foo.Add(1, new List<int>( new int[] { 1, 2, 3, 4 }));
foo.Add(2, new List<int>(new int[] { 2, 3, 4, 1 }));
foo.Add(3, new List<int>(new int[] { 3, 4, 1, 2 }));
foo.Add(4, new List<int>(new int[] { 4, 1, 2, 3 }));
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Dictionary<int, List<int>>));
using (MemoryStream ms = new MemoryStream())
{
serializer.WriteObject(ms, foo);
Console.WriteLine(Encoding.Default.GetString(ms.ToArray()));
}
}
}
}
这将写入控制台:
[{\"Key\":1,\"Value\":[1,2,3,4]},{\"Key\":2,\"Value\":[2,3,4,1]},{\"Key\":3,\"Value\":[3,4,1,2]},{\"Key\":4,\"Value\":[4,1,2,3]}]
(using System.Web.Script.Serialization
)
这段代码会将任何内容转换Dictionary<Key,Value>
为Dictionary<string,string>
,然后将其序列化为JSON字符串:
var json = new JavaScriptSerializer().Serialize(yourDictionary.ToDictionary(item => item.Key.ToString(), item => item.Value.ToString()));
值得注意的是,类似的东西Dictionary<int, MyClass>
也可以通过这种方式序列化,同时保留复杂的类型/对象。
var yourDictionary = new Dictionary<Key,Value>(); //This is just to represent your current Dictionary.
您可以将变量替换为yourDictionary
实际变量。
var convertedDictionary = yourDictionary.ToDictionary(item => item.Key.ToString(), item => item.Value.ToString()); //This converts your dictionary to have the Key and Value of type string.
我们这样做是因为Key和Value都必须为string类型,这是对a进行序列化的要求Dictionary
。
var json = new JavaScriptSerializer().Serialize(convertedDictionary); //You can then serialize the Dictionary, as both the Key and Value is of type string, which is required for serialization.
System.Web.Extensions
不在Client Framework版本中,但是也需要完整版本。
抱歉,如果语法是最微小的,但是我从中得到的代码最初是在VB中的:)
using System.Web.Script.Serialization;
...
Dictionary<int,List<int>> MyObj = new Dictionary<int,List<int>>();
//Populate it here...
string myJsonString = (new JavaScriptSerializer()).Serialize(MyObj);
在Asp.net Core中使用:
using Newtonsoft.Json
var obj = new { MyValue = 1 };
var json = JsonConvert.SerializeObject(obj);
var obj2 = JsonConvert.DeserializeObject(json);
System.Core
,然后尝试引用using Newtonsoft.Json
,没有喜悦。我认为这Newtonsoft
是一个第三方图书馆。
仅使用Microsoft的标准.Net库执行此操作的方法…
using System.IO;
using System.Runtime.Serialization.Json;
private static string DataToJson<T>(T data)
{
MemoryStream stream = new MemoryStream();
DataContractJsonSerializer serialiser = new DataContractJsonSerializer(
data.GetType(),
new DataContractJsonSerializerSettings()
{
UseSimpleDictionaryFormat = true
});
serialiser.WriteObject(stream, data);
return Encoding.UTF8.GetString(stream.ToArray());
}
Dictionary<string, dynamic>
并具有所有JSON基本类型,例如整数,浮点数,布尔值,字符串,甚至null以及一个对象内。+1
您可以使用JavaScriptSerializer。
string
。如果您想看看,我在这里发布了一个答案。
似乎有很多不同的库,而前几年似乎没有来去去去。但是,截至2016年4月,此解决方案对我来说效果很好。字符串很容易用int代替。
//outputfilename will be something like: "C:/MyFolder/MyFile.txt"
void WriteDictionaryAsJson(Dictionary<string, List<string>> myDict, string outputfilename)
{
DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(Dictionary<string, List<string>>));
MemoryStream ms = new MemoryStream();
js.WriteObject(ms, myDict); //Does the serialization.
StreamWriter streamwriter = new StreamWriter(outputfilename);
streamwriter.AutoFlush = true; // Without this, I've run into issues with the stream being "full"...this solves that problem.
ms.Position = 0; //ms contains our data in json format, so let's start from the beginning
StreamReader sr = new StreamReader(ms); //Read all of our memory
streamwriter.WriteLine(sr.ReadToEnd()); // and write it out.
ms.Close(); //Shutdown everything since we're done.
streamwriter.Close();
sr.Close();
}
两个导入点。首先,请确保在Visual Studio的解决方案资源管理器中的项目中添加System.Runtime.Serliazation作为引用。其次,添加此行,
using System.Runtime.Serialization.Json;
在文件的顶部以及其余的用法,因此DataContractJsonSerializer
可以找到该类。这篇博客文章提供了有关此序列化方法的更多信息。
我的数据是一个包含3个字符串的字典,每个字符串都指向一个字符串列表。字符串列表的长度分别为3、4和1。数据如下所示:
StringKeyofDictionary1 => ["abc","def","ghi"]
StringKeyofDictionary2 => ["String01","String02","String03","String04"]
Stringkey3 => ["someString"]
写入文件的输出将在一行上,这是格式化的输出:
[{
"Key": "StringKeyofDictionary1",
"Value": ["abc",
"def",
"ghi"]
},
{
"Key": "StringKeyofDictionary2",
"Value": ["String01",
"String02",
"String03",
"String04",
]
},
{
"Key": "Stringkey3",
"Value": ["SomeString"]
}]
这与Meritt先前发布的内容相似。只是发布完整的代码
string sJSON;
Dictionary<string, string> aa1 = new Dictionary<string, string>();
aa1.Add("one", "1"); aa1.Add("two", "2"); aa1.Add("three", "3");
Console.Write("JSON form of Person object: ");
sJSON = WriteFromObject(aa1);
Console.WriteLine(sJSON);
Dictionary<string, string> aaret = new Dictionary<string, string>();
aaret = ReadToObject<Dictionary<string, string>>(sJSON);
public static string WriteFromObject(object obj)
{
byte[] json;
//Create a stream to serialize the object to.
using (MemoryStream ms = new MemoryStream())
{
// Serializer the object to the stream.
DataContractJsonSerializer ser = new DataContractJsonSerializer(obj.GetType());
ser.WriteObject(ms, obj);
json = ms.ToArray();
ms.Close();
}
return Encoding.UTF8.GetString(json, 0, json.Length);
}
// Deserialize a JSON stream to object.
public static T ReadToObject<T>(string json) where T : class, new()
{
T deserializedObject = new T();
using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(deserializedObject.GetType());
deserializedObject = ser.ReadObject(ms) as T;
ms.Close();
}
return deserializedObject;
}
如果您的上下文允许(技术限制等),请使用Newtonsoft.Json的JsonConvert.SerializeObject
方法:它将使您的生活更轻松。
Dictionary<string, string> localizedWelcomeLabels = new Dictionary<string, string>();
localizedWelcomeLabels.Add("en", "Welcome");
localizedWelcomeLabels.Add("fr", "Bienvenue");
localizedWelcomeLabels.Add("de", "Willkommen");
Console.WriteLine(JsonConvert.SerializeObject(localizedWelcomeLabels));
// Outputs : {"en":"Welcome","fr":"Bienvenue","de":"Willkommen"}