2013-04-18 31 views
6

Tôi đã tự hỏi cách hiệu quả nhất để phân tích cú pháp JSON trong C# là gì? Và bằng hiệu quả, tôi có nghĩa là người có thời gian phản hồi thấp hơn. Tôi đang cố gắng phân tích một lượng lớn dữ liệu bằng cách sử dụng một vài phương pháp và thời gian phản hồi trong cả hai phương pháp này đều cao. Bất cứ ai có thể cho tôi biết sự khác biệt giữa các phương pháp sau đây? Có cách nào khác để tôi phân tích cú pháp với thời gian phản hồi thấp hơn không?Cách hiệu quả nhất để phân tích cú pháp JSON trong C#

Lựa chọn 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()); 
} 

Phương án 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); 
} 
+0

Vâng ... làm thế nào lớn là dữ liệu của bạn một cách chính xác? Xác định thời gian phản hồi "Cao" của bạn là gì? bạn đã xác định xem nút cổ chai là mạng hay điều trị chưa? –

+0

Hãy thử với ServiceStack, Json.Net, JavaScriptSerializer vv và xem kết quả. – I4V

+1

http://www.servicestack.net/benchmarks/ – I4V

Trả lời

11

Bạn có thể tìm thấy một so sánh trong cách theo liên kết.

Các thư viện kiểm tra:

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

  • Json.NET - Một thư viện phổ biến C# JSON.
  • Gapi.NET - Gapi.NET không phải là thư viện phân tích cú pháp JSON, nhưng nó chứa các thường trình phân tích JSON.
  • Procurios - Một thư viện C# JSON khác. Xem thêm bài đăng trên blog này cách sử dụng nó để phân tích cú pháp dữ liệu Twiter.
  • JavaScriptSerializer - .NET 3.5 trình phân tích cú pháp JSON được tích hợp sẵn.
  • DataContractJsonSerializer - .NET 3.5 trình phân tích cú pháp JSON được tích hợp sẵn.
  • AjaxPro - Thư viện AJAX C#.

enter image description here


Cập nhật:

Added thông tin này dựa trên nhận xét Matt Johnson

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

+1

Đừng quên [ServiceStack.Text] (https://github.com/ServiceStack/ServiceStack.Text). Điểm chuẩn [ở đây] (http://theburningmonk.com/2011/11/performance-test-json-serializers-part-ii/). –

+0

Cảm ơn bạn đã trả lời! Theo blog của Sagi, Json là tốt hơn so với DataContractJsonSerializer, nhưng theo liên kết của Matt, DataContract là tốt hơn .. Bạn đã có một sự thay đổi để so sánh Gapi.NET vs ServiceStack.Text? – Gonzalo

+1

@Gonzalo - Cá nhân, tôi sử dụng JSON.Net. Tất cả các điểm chuẩn này đều lỗi thời, tôi chưa thấy một phiên bản gần đây - vì vậy tôi không biết ai là người nhanh nhất hiện nay. Tuy nhiên bạn nhìn vào nó, đây là sự khác biệt mili giây nhiều nhất. JSON.Net được triển khai rộng rãi nhất, rất ổn định và rất linh hoạt. Tôi đánh giá cao hơn tôi coi trọng hiệu suất thô. –

1

Phương pháp đầu tiên có cơ hội để kiếm được ít bản sao da ta. Nhưng tôi gặp khó khăn khi tin rằng một trong hai phương pháp tạo nên sự khác biệt có thể đo lường được. Chi phí thực của bạn sẽ là chi phí mạng.

1
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... 
     } 

    } 
} 

}

+0

OP quan tâm đến hiệu quả. Đây là một cách để làm điều đó, và có lẽ không phải là cách hiệu quả nhất. – CodesInChaos

0

Ra khỏi tò mò, tôi đã có cả JSON.NET 5,0 r8 và của riêng tôi (chỉ ~ 500 dòng mã) đồ chơi JSON parser ăn kích thước tệp JSON khác nhau có hoặc không có vòng, từ vài chục ký tự ballpark, tới một tệp JSON 180 mb, trong số dữ liệu "thực".

Dữ liệu mẫu (bao gồm JSON 12mb nhưng không bao gồm 180mb có thể tìm thấy ở nơi khác) :

https://github.com/ysharplanguage/FastJsonParser

'Hy vọng điều đó sẽ hữu ích.

P.S. Liên kết tốt để biết về, btw, đã được cung cấp bởi Chamika trong bình luận của mình.

EDIT

Trước khi tôi quên (hoặc chỉ cần trong trường hợp nó đã bị bỏ qua), đây là loại phải-biết/phải đọc, IMO, về tầm quan trọng của không nhấn mạnh đối tượng lớn của CLR đống bất cứ khi nào có thể, nhờ vào đọc xem trực tiếp của JSON mã của bạn tiêu thụ, đặc biệt là trong bối cảnh của một môi trường máy chủ web:

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

PPS (Do đó thử nghiệm cuối cùng trong Program.cs để kiểm tra/giới thiệu trình phân tích cú pháp đồ chơi của tôi mà tôi đã liên kết, ở trên)

'HTH!

1

Vẫn còn trong giai đoạn đầu nhưng tôi xây dựng một bộ tạo mã trên đầu trang của Json.NET rằng loại bỏ phản xạ và tăng tốc deserialization bởi một yếu tố của 4.

Thanh toán CGbR JSON target.

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

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

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

sẽ tạo ra một lớp học phần:

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; 
} 
Các vấn đề liên quan