如何在 C # 中将字典转换为 JSON 字符串?

我想把我的 Dictionary<int,List<int>>转换成 JSON 字符串。有人知道如何在 C # 中实现这一点吗?

405419 次浏览
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]}]

对不起,如果语法是最小的位关闭,但代码,我得到这是最初在 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);

你可以用 JavaScriptSerializer

序列化数据结构 只包含数值或布尔值相当简单。如果没有太多要序列化的内容,可以为特定类型编写一个方法。

对于指定的 Dictionary<int, List<int>>,可以使用 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 类可以很好地序列化这种类型,但是它在使用字典时会出现问题。

文件: 使用 Json.NET 序列化集合

简单的一行答案

(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.

我们这样做是因为键和值都必须是字符串类型,这是序列化 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.

这个答案 提到了 Json.NET,但是没有告诉你如何使用 Json.NET 来序列化一个字典:

return JsonConvert.SerializeObject( myDictionary );

与 JavaScriptSerializer 不同,myDictionary不必是类型为 <string, string>的字典,JsonConvert 就可以工作。

你可以使用 System.Web.Script.Serialization.JavaScriptSerializer:

Dictionary<string, object> dictss = new Dictionary<string, object>(){
{"User", "Mr.Joshua"},
{"Pass", "4324"},
};


string jsonString = (new JavaScriptSerializer()).Serialize((object)dictss);

它似乎有很多不同的图书馆和什么似乎没有来了和去了在过去的几年。然而到了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();
}

两个进口点。首先,确保添加 System。运行时间。在 VisualStudio 的解决方案资源管理器中将 Serliazation 作为项目中的引用。其次,加上这一行,

using System.Runtime.Serialization.Json;

在文件的顶部与您的其余使用,所以 DataContractJsonSerializer类可以找到。这个 博客文章有关于这种序列化方法的更多信息。

数据格式(输入/输出)

我的数据是一个有3个字符串的字典,每个字符串指向一个字符串列表。字符串列表的长度分别为3、4和1。 数据如下:

StringKeyofDictionary1 => ["abc","def","ghi"]
StringKeyofDictionary2 => ["String01","String02","String03","String04"]
Stringkey3 => ["someString"]

写入 file 的输出只有一行,下面是格式化的输出:

 [{
"Key": "StringKeyofDictionary1",
"Value": ["abc",
"def",
"ghi"]
},
{
"Key": "StringKeyofDictionary2",
"Value": ["String01",
"String02",
"String03",
"String04",
]
},
{
"Key": "Stringkey3",
"Value": ["SomeString"]
}]

在 Asp.net 中核心使用:

using Newtonsoft.Json


var obj = new { MyValue = 1 };
var json = JsonConvert.SerializeObject(obj);
var obj2 = JsonConvert.DeserializeObject(json);

这与 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;
}

下面介绍如何只使用微软的标准.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());
}

如果您的上下文允许它(技术限制等) ,使用 牛顿软件,杰森中的 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"}

仅供参考,在所有旧的解决方案中: UWP 有自己的内置 JSON 库 Windows.Data.Json

JsonObject是一个可以直接用来存储数据的映射:

var options = new JsonObject();
options["foo"] = JsonValue.CreateStringValue("bar");
string json = options.ToString();

改进后的 Mwjohnson 版本:

string WriteDictionaryAsJson_v2(Dictionary<string, List<string>> myDict)
{
string str_json = "";
DataContractJsonSerializerSettings setting =
new DataContractJsonSerializerSettings()
{
UseSimpleDictionaryFormat = true
};


DataContractJsonSerializer js =
new DataContractJsonSerializer(typeof(Dictionary<string, List<string>>), setting);


using (MemoryStream ms = new MemoryStream())
{
// Serializer the object to the stream.
js.WriteObject(ms, myDict);
str_json = Encoding.Default.GetString(ms.ToArray());


}
return str_json;
}

净核心: 系统。文本。 Json.JsonSerializer。序列化(dict)