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


130

我想将其转换Dictionary<int,List<int>>为JSON字符串。有谁知道如何在C#中实现这一目标?


3
使用newtonSoft.json nuget包。JsonConvert.SerializeObject(yourObject)
RayLoveless

Answers:


118

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

对于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是一个流行的选项。


66
这种解决方案充其量只是天真。使用真实的json序列化库。
jacobsimeon 2012年

131
@Jacob-天真?哎哟。就我个人而言,当我需要做的所有事情都可以用一种简单的方法完成时,我就无法证明要包含另一个程序集。
gilly3

16
还有更多关于gilly3评论的信息。有时您在Windows Phone上进行编码。您将添加zlip,twitter,google,音频处理,图像处理。如果您的用法很简单,则最好实现这样的简单方法,以及一些用于社交媒体交互的基本HttpRequest。添加程序集时,您始终必须处理错误,并且无法获得精简版本。顺便说一下,在json库中,有像这样的幼稚方法,没有魔术。
莱昂佩尔蒂埃

14
每个打开的项目上应该有一个页面告诉您:“嘿,大多数时候,您只想执行这10行算法。这是代码。”
莱昂佩尔蒂埃

31
dict.add(“ RandomKey \”“,” RandomValue \“”)); BOOOOOOOOOOOOOOOOM。幼稚充其量。使用真实的json序列化库。
Sleeper Smith

112

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

return JsonConvert.SerializeObject( myDictionary );

与JavaScriptSerializer相对,JsonConvert myDictionary不一定必须是类型字典<string, string>


71

Json.NET现在可能已经适当地序列化了C#字典,但是当OP最初发布此问题时,许多MVC开发人员可能一直在使用JavaScriptSerializer类,因为这是开箱即用的默认选项。

如果你工作在一个传统项目(MVC 1或MVC 2),并且不能使用Json.NET,我建议你使用List<KeyValuePair<K,V>>,而不是一个Dictionary<K,V>>。遗留的JavaScriptSerializer类可以很好地序列化此类型,但是它在字典方面会遇到问题。

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


3
对于asp.net mvc3和mvc4用户的完美答案
Gomes

当读回Javascript时,JsonConvert.SerializeObject似乎无法处理将c#字典序列化为可枚举的类型。相反,它使对象成为一个对象,其中C#集合中的每一对现在都是对象中的普通属性/值,无法像集合一样轻松枚举。因此,除非我的nuget版本不正确,否则在这方面,Json.NET仍然不够用。
StingyJack

哦是的 我已经在做类似的事情,但是试图找到另一种方法,却偶然发现了这一点。我觉得让其他人知道避开此项目的Json.NET兔子洞可能很有用(否则效果很好)。
StingyJack

20
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]}]

18

简单的一线答案

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.

我的C#中没有JavaScriptSerializer。
2014年

1
@Jonny你缺少参考装配System.Web.Extensions程序 msdn.microsoft.com/en-us/library/...
aminhotob

我读过System.Web.Extensions不在Client Framework版本中,但是也需要完整版本。
vapcguy

可能是有限应用程序的解决方案,但是如果任何对象属性都不是string类型,则强制所有值键入string都不会产生正确的JSON。
Suncat2000

1
关于此主题的最佳答案。
T.Todua

12

抱歉,如果语法是最微小的,但是我从中得到的代码最初是在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);

2
它引发ArgumentException:字典的序列化/反序列化不支持类型'System.Collections.Generic.Dictionary`2,键必须为字符串或对象。
Pavel Chuchuva


7

在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是一个第三方图书馆。
vapcguy

2
@vapcguy是的,Newtonsoft是第三方,但在其产品中也被MS广泛使用和采用。nuget.org/packages/Newtonsoft.Json
SkorunkaFrantišek17

7

您可以使用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);

2

仅使用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
Christos Lytras

1

您可以使用JavaScriptSerializer


字典可以序列化吗?
Numenor

我本以为这会工作-字符串json = serializer.Serialize((object)dict);
2011年

1
@Numenor是的,它们是,但仅当键AND值的类型为时string。如果您想看看,我在这里发布了一个答案。
HowlinWulf14年

@HowlinWulf更确切地说,该值不必是字符串。但是对于关键来说,它绝对不是一个整数。字符串最适合作为键。
Gyum Fox

1
@ Twelve47应该包括示例用法,以防链接被移动。否则,有一天这一答案可能变得毫无用处。
vapcguy

1

似乎有很多不同的库,而前几年似乎没有来去去去。但是,截至2016年4月,此解决方案对我来说效果很好。字符串很容易用int代替

TL / DR;如果这是您来这里的目的,请复制此文件:

    //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"]
 }]

0

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

0

如果您的上下文允许(技术限制等),请使用Newtonsoft.JsonJsonConvert.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"}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.