【问题标题】:How to decode a JSON string using C#?如何使用 C# 解码 JSON 字符串?
【发布时间】:2011-10-08 21:45:25
【问题描述】:

我正在寻找使用 C# 解码 JSON 字符串的示例代码/库。

要编码,我可以这样做:

var data = new Dictionary<string,string>(); 
data.Add("..", "..."); 
var json_encoded = new JavaScriptSerializer().Serialize(data); 

但是我该如何解码呢?

var json_decoded = ?? 

【问题讨论】:

  • 只需使用Json.NET,您就可以对您想创建的任何类型进行序列化和反序列化。
  • Json Deserialize C#的可能重复

标签: c# .net json javascriptserializer


【解决方案1】:

你可以这样做:

var data = new Dictionary<string, string>();
data.Add("foo", "baa"); 

JavaScriptSerializer ser = new JavaScriptSerializer();
var JSONString = ser.Serialize(data); //JSON encoded

var JSONObj = ser.Deserialize<Dictionary<string, string>>(JSONString); //JSON decoded
Console.Write(JSONObj["foo"]); //prints: baa

【讨论】:

  • 应该注意,这不会将 JSON 字符串反序列化回 Type,这在某些情况下可能没问题。我发现将字符串反序列化为 Type 是一种更强大的解决方案。
  • 如果您的 json 结构有点复杂,请使用 jsonutils.com 为您生成类型。
【解决方案2】:

这将采用 JSON 并将其转换为您指定的强类型类 (T)

public static T Deserialize<T>(string json)
        {
            var obj = Activator.CreateInstance<T>();
            using(var ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
            {
                var serializer = new DataContractJsonSerializer(obj.GetType());
                obj = (T) serializer.ReadObject(ms);
                return obj;
            }
        }

这将接受一个类并将其序列化为 JSON

    public static string Serialize<T>(T obj)
    {
        var serializer = new DataContractJsonSerializer(obj.GetType());
        using (var ms = new MemoryStream())
        {
            serializer.WriteObject(ms, obj);
            return Encoding.Default.GetString(ms.ToArray());
        }
    }

注意:在第一个示例中,您需要有一个支持类来指定 T 是什么类型。因此,如果您告诉它 T 是 User 类型,则需要在某处指定:

public class User
    {
        public string Username { get; set; }
        public string Firstname { get; set; }
    }

【讨论】:

  • 是否值得构造 one DataContractJsonSerializer 对象(每个可序列化类型)而不是为每个序列化构造一个新对象?
  • @Timwi,这取决于。保存实例将花费您更多的内存,但如果您不这样做,经济速度会降低。这真的归结为你的具体情况。理想情况下,您希望保留经常使用的序列化程序,并丢弃不常用的序列化程序。
猜你喜欢
  • 2011-08-27
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
  • 2020-06-02
  • 2020-12-28
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
相关资源
最近更新 更多