【发布时间】:2011-08-01 15:01:28
【问题描述】:
我想将我的Dictionary<int,List<int>> 转换为 JSON 字符串。有谁知道如何在 C# 中实现这一点?
【问题讨论】:
-
使用 newtonSoft.json nuget 包。 JsonConvert.SerializeObject(yourObject)
标签: c# json dictionary
我想将我的Dictionary<int,List<int>> 转换为 JSON 字符串。有谁知道如何在 C# 中实现这一点?
【问题讨论】:
标签: c# json dictionary
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。
【讨论】:
string。如果你想看看,我已经在这里发布了一个答案。
序列化仅包含数字或布尔值的数据结构相当简单。如果您没有太多要序列化的内容,您可以为您的特定类型编写一个方法。
对于您指定的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 类可以很好地序列化这种类型,但它会遇到字典问题。
【讨论】:
(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 都必须是字符串类型,这是 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 不在客户端框架版本中,但也需要完整版本。
This answer 提到了 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 月,这个解决方案对我来说效果很好。 字符串很容易被整数替换。
//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 类。这个blog post 有更多关于这种序列化方法的信息。
我的数据是一个包含 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"]
}]
【讨论】:
在 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 是一个第三方库。
这与 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;
}
【讨论】:
以下是仅使用 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 原始类型,如整数、浮点数、布尔值、字符串,甚至是空值。 +1
如果您的上下文允许(技术限制等),请使用 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"}
【讨论】:
仅供参考,在所有较旧的解决方案中: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;
}
【讨论】: