【问题标题】:How do I convert a dictionary to a JSON String in C#?如何在 C# 中将字典转换为 JSON 字符串?
【发布时间】:2011-08-01 15:01:28
【问题描述】:

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

【问题讨论】:

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

标签: c# json dictionary


【解决方案1】:
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]}]

【讨论】:

    【解决方案2】:

    对不起,如果语法有一点点偏差,但我从中得到的代码最初是在 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);
    

    【讨论】:

    • 抛出 ArgumentException: Type 'System.Collections.Generic.Dictionary`2 is not supported for serialization/deserialization of a dictionary, key must be strings or objects.
    【解决方案3】:

    你可以使用JavaScriptSerializer

    【讨论】:

    • 字典可以序列化吗?
    • 我原以为这会起作用 - string json = serializer.Serialize((object)dict);
    • @Numenor 是的,它们是,但前提是 Key AND Value 的类型为 string。如果你想看看,我已经在这里发布了一个答案。
    • @HowlinWulf 更准确地说,该值不必是字符串。但是对于 key,它不能绝对是 int。字符串最适合作为键。
    • @Twelve47 应该包含一个示例用法,以防该链接被移动。否则,这个答案有一天会变得毫无用处。
    【解决方案4】:

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

    对于您指定的Dictionary&lt;int, List&lt;int&gt;&gt;,您可以使用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 序列化库。
    • @Jacob - 天真?哎哟。就个人而言,当我需要做的所有事情都可以通过一个简短而简单的方法完成时,我无法证明包含 另一个 程序集是合理的。
    • 关于 gilly3 的更多评论。有时您在 Windows Phone 上进行编码。您正在添加 zlip、twitter、google、音频处理内容、图像处理内容。如果您的使用很简单,您最好实现类似它的简单方法,以及一些用于社交媒体交互的基本 HttpRequest。添加程序集时,您总是必须处理错误,并且不可能获得精简版。顺便说一句,在 json 库中,有像这样的幼稚方法,没有魔法。
    • 每个打开的项目上都应该有一个页面告诉你:“嘿,大多数时候,你只想执行这 10 行算法。这是代码。”
    • dict.add("RandomKey\"", "RandomValue\"");呜呜呜呜呜呜。最好是天真。使用真正的 json 序列化库。
    【解决方案5】:

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

    如果您正在处理遗留项目(MVC 1 或 MVC 2),并且无法使用 Json.NET,我建议您使用 List&lt;KeyValuePair&lt;K,V&gt;&gt; 而不是 Dictionary&lt;K,V&gt;&gt;。旧的 JavaScriptSerializer 类可以很好地序列化这种类型,但它会遇到字典问题。

    文档:Serializing Collections with Json.NET

    【讨论】:

    • asp.net mvc3 和 mvc4 用户的完美答案
    • JsonConvert.SerializeObject 在读回 Javascript 时似乎无法处理将 c# 字典序列化为可枚举集合的类型。相反,它创建了一个对象,其中 C# 集合中的每一对现在都是对象中的普通属性/值,不能像集合一样容易地枚举。所以,除非我有一个来自 nuget 的坏版本,否则 Json.NET 仍然不够。在这方面。
    • 哦,是的。我已经在做类似的事情,但试图找出另一种方式,并偶然发现了这一点。我觉得让其他人知道避免此项目的 Json.NET 兔子洞可能很有用(否则效果很好)。
    【解决方案6】:

    简单的单行答案

    (using System.Web.Script.Serialization)

    此代码会将任何Dictionary&lt;Key,Value&gt; 转换为Dictionary&lt;string,string&gt;,然后将其序列化为 JSON 字符串:

    var json = new JavaScriptSerializer().Serialize(yourDictionary.ToDictionary(item => item.Key.ToString(), item => item.Value.ToString()));
    

    值得注意的是,像Dictionary&lt;int, MyClass&gt; 这样的东西也可以通过这种方式序列化,同时保留复杂的类型/对象。


    说明(细分)

    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.
    

    【讨论】:

    • 我的 C# 中没有 JavaScriptSerializer。
    • @Jonny 你缺少参考程序集 System.Web.Extensions msdn.microsoft.com/en-us/library/…
    • 我了解到System.Web.Extensions 不在客户端框架版本中,但也需要完整版本。
    • 关于这个话题的最佳答案。
    • 这应该是答案。
    【解决方案7】:

    This answer 提到了 Json.NET,但没有告诉你如何使用 Json.NET 序列化字典:

    return JsonConvert.SerializeObject( myDictionary );
    

    与 JavaScriptSerializer 不同,myDictionary 不必是 &lt;string, string&gt; 类型的字典,JsonConvert 才能工作。

    【讨论】:

    • 我有一个字典 result = new Dictionary();并且在序列化 itr JsonConvert.SerializeObject(result) 时,它将数字从 1 转换为 1.0 。知道如何避免吗?
    【解决方案8】:

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

    【讨论】:

      【解决方案9】:

      似乎有很多不同的图书馆,而过去几年似乎没有的东西来来去去。然而,截至 2016 年 4 月,这个解决方案对我来说效果很好。 字符串很容易被整数替换

      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 类。这个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"]
       }]
      

      【讨论】:

        【解决方案10】:

        在 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 是的,Newtonsoft 是第 3 方,但在其产品中也被 MS 广泛使用和采用。 nuget.org/packages/Newtonsoft.Json
        【解决方案11】:

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

        【讨论】:

          【解决方案12】:

          以下是仅使用 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&lt;string, dynamic&gt; 结合使用,并在一个对象中包含所有 JSON 原始类型,如整数、浮点数、布尔值、字符串,甚至是空值。 +1
          【解决方案13】:

          如果您的上下文允许(技术限制等),请使用 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"}
          

          【讨论】:

            【解决方案14】:

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

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

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

            【讨论】:

              【解决方案15】:

              改进了 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;
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2016-12-06
                • 2017-08-11
                • 2014-09-02
                • 1970-01-01
                • 1970-01-01
                • 2017-02-13
                • 1970-01-01
                相关资源
                最近更新 更多