9

我想知道在 C# 中解析 JSON 的最有效方法是什么?我所说的高效是指响应时间较短的那个。我正在尝试使用几种方法解析大量数据,并且这两种方法的响应时间都很长。谁能告诉我以下方法之间的区别?是否有替代方法可以让我以较短的响应时间进行解析?

选项1:

HttpWebRequest request = WebRequest.Create(jsonURL) as HttpWebRequest;
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
    if (response.StatusCode != HttpStatusCode.OK)
        throw new Exception(String.Format(
        "Server error (HTTP {0}: {1}).",
        response.StatusCode,
        response.StatusDescription));
    DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(obj));
    object objResponse = jsonSerializer.ReadObject(response.GetResponseStream());
}  

选项 2:

var json = new WebClient().DownloadString(jsonURL);
using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
{
    DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(obj));
    object objResponse = jsonSerializer.ReadObject(ms);
}  
4

5 回答 5

13

您可以在以下链接中找到比较。

测试的库:

http://sagistech.blogspot.com/2010/03/parsing-twitter-json-comparing-c.html

  • Json.NET - 一个流行的 C# JSON 库。
  • Gapi.NET - Gapi.NET 不是 JSON 解析库,但它包含 JSON 解析例程。
  • Procurios - 另一个 C# JSON 库。另请参阅此博客文章如何使用它来解析 Twiter 数据。
  • JavaScriptSerializer - .NET 3.5 内置 JSON 解析器。
  • DataContractJsonSerializer - .NET 3.5 内置 JSON 解析器。
  • AjaxPro - AC# AJAX 库。

在此处输入图像描述


更新:

根据马特约翰逊的评论添加了此信息

http://theburningmonk.com/2011/11/performance-test-json-serializers-part-ii/

于 2013-04-18T16:29:29.423 回答
1

第一种方法有机会制作更少的数据副本。但我很难相信这两种方法都会产生可衡量的差异。您的实际成本将是网络成本。

于 2013-04-18T16:30:24.833 回答
1

仍处于早期阶段,但我在 Json.NET 之上构建了一个代码生成器,它消除了反射并将反序列化速度提高了 4 倍。

出 CGbR JSON 目标

[DataContract]
public partial class Root
{
    [DataMember]
    public int Number { get; set; }

    [DataMember]
    public Partial[] Partials { get; set; }

    [DataMember]
    public IList<ulong> Numbers { get; set; }
}

将生成一个部分类:

public Root FromJson(JsonReader reader)
{
    while (reader.Read())
    {
        // Break on EndObject
        if (reader.TokenType == JsonToken.EndObject)
            break;

        // Only look for properties
        if (reader.TokenType != JsonToken.PropertyName)
            continue;

        switch ((string) reader.Value)
        {
            case "Number":
                reader.Read();
                Number = Convert.ToInt32(reader.Value);
                break;

            case "Partials":
                reader.Read(); // Read token where array should begin
                if (reader.TokenType == JsonToken.Null)
                    break;
                var partials = new List<Partial>();
                while (reader.Read() && reader.TokenType == JsonToken.StartObject)
                    partials.Add(new Partial().FromJson(reader));
                Partials = partials.ToArray();
                break;

            case "Numbers":
                reader.Read(); // Read token where array should begin
                if (reader.TokenType == JsonToken.Null)
                    break;
                var numbers = new List<ulong>();
                while (reader.Read() && reader.TokenType != JsonToken.EndArray)
                    numbers.Add(Convert.ToUInt64(reader.Value));
                Numbers = numbers;
                break;

        }
    }

    return this;
}
于 2016-04-05T07:03:55.153 回答
0

出于好奇,我有 JSON.NET 5.0 r8 和我自己的(只有约 500 行代码)玩具 JSON 解析器吃各种 JSON 文件大小,有或没有循环,从几十个字符球场到一个 180 mb JSON文件,例如,“真实”数据。

示例数据(包括 12mb JSON,但不包括可以在其他地方找到的 180mb JSON)以及附带的详细信息,例如从流解析以反序列化为 POCO(强类型)对象的示例,可以在此处找到:

https://github.com/ysharplanguage/FastJsonParser

'希望能帮助到你。

PS 好的链接,顺便说一句,Chamika 在他的评论中已经提供了。

编辑

在我忘记之前(或以防它被忽略),这是 IMO 必知/必读的一种,关于尽可能强调 CLR 的大型对象堆的重要性,这要归功于对 JSON 代码的流式读取消费,尤其是在 Web 服务器环境的上下文中:

http://insidethecpu.wordpress.com/2013/06/19/json-parsing/

PPS(因此,Program.cs 中的最后一个测试是测试/展示我链接到的玩具解析器,上面)

'嗯!

于 2013-12-04T08:57:49.417 回答
0
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace Example
{
public static class JavascriptSerializator
{
    /// <summary>
    /// Serializes object to JSON from Microsoft
    /// </summary>
    /// <param name="objectForSerialization"></param>
    /// <returns></returns>
    public static string SerializeMJSON(this object objectForSerialization)
    {
        try
        {
            System.Web.Script.Serialization.JavaScriptSerializer s = new System.Web.Script.Serialization.JavaScriptSerializer();

            return s.Serialize(objectForSerialization);
        }
        catch (Exception ex)
        {
            /// Handle exception and throw it ...
        }

    }

    /// <summary>
    /// Deserializes object from Microsoft JSON string
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="str"></param>
    /// <returns></returns>
    public static T DeserializeMJSON<T>(this string str)
    {
        try
        {
            System.Web.Script.Serialization.JavaScriptSerializer s = new System.Web.Script.Serialization.JavaScriptSerializer();

            return s.Deserialize<T>(str);
        }
        catch (Exception ex)
        {
            //// Handle the exception here...
        }

    }
}

}

于 2013-04-18T16:34:11.117 回答