2013-04-18 25 views
6

C#でJSONを解析する最も効率的な方法は何ですか?効率的には応答時間の短いものを意味します。私は、いくつかの方法を使用して大量のデータを解析しようとしています。これらの方法の両方で応答時間が長くなります。誰も私に以下の方法の違いを教えてもらえますか?レスポンスタイムを短くして解析する方法はありますか?JSONをC#で解析する最も効率的な方法

オプション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); 
} 
+0

うーん...正確にあなたのデータをどのように大規模なのですか?現在、「高い」応答時間の意味を定義します。ボトルネックがネットワークか治療かどうかをすでに確認していますか? –

+0

ServiceStack、Json.Net、JavaScriptSerializerなどで試してみてください。 – I4V

+1

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

答えて

11

あなたは、リンクは次の比較を見つけることができます。テスト

ライブラリ:

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 - A C#AJAXライブラリ。

enter image description here


更新:マット・ジョンソンさんのコメントに基づいて

を追加しました。この情報

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

+1

[ServiceStack.Text](https://github.com/ServiceStack/ServiceStack.Text)を忘れないでください。ベンチマーク[ここ](http://theburningmonk.com/2011/11/performance-test-json-serializers-part-ii/)。 –

+0

答えをありがとう! Sagiのブログによると、JsonはDataContractJsonSerializerより優れていますが、Mattのリンクによれば、DataContractは優れています。Gapi.NETとServiceStack.Textを比較するための変更がありましたか? – Gonzalo

+1

@Gonzalo - 個人的には、JSON.Netを使用します。これらのベンチマークはすべて古くなっていますが、私は最近のベンチマークを見ていません - 誰が現在最も速いのか分かりません。しかし、あなたはそれを見ていますが、これはせいぜいミリ秒の違いです。 JSON.Netは、最も広く実装され、非常に安定しており、非常に柔軟性があります。私は生の価値を評価する以上に価値がある。 –

1

第一の方法は、より少ないコピーを作成する機会を持っていますダta。しかし、いずれの方法でも測定可能な差があると信じています。実際のコストはネットワークコストになります。好奇心のうち

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効率性に関心があります。これはこれを行う方法の1つで、おそらく最も効率的な方法ではありません。 – CodesInChaos

0

、私は、両方のJSON.NET 5.0 R8と私自身(のコードのみ〜500行)おもちゃのJSONパーサーは、ループの有無にかかわらず、さまざまなJSONファイルのサイズを食べていたです数十文字の野球場から、例えば「実際の」データの1つの180メガバイトのJSONファイルに変換されます。

ストリームから解析してPOCO(強く型付けされた)オブジェクトに逆シリアル化する例のような、詳細を伴うサンプルデータ(12mbのJSONを含むが、他の場所にある180mbのものを除く)がここにあります:

https://github.com/ysharplanguage/FastJsonParser

「それがお役に立てば幸いです。

P.S. Chamikaが彼のコメントですでに提供している、良い知りたいリンク、btw。

EDIT

私は忘れて(あるいは念のため、それが見落とされた)の前には、ここにCLRのラージオブジェクトを強調ないの重要性について、IMO、必見のノウハウ/必読のようなものですヒープ可能な限り、あなたのコードは、消費JSONのストリーミング読書のおかげで、特にWebサーバ環境のコンテキストで:

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

PPS (私がリンクしている玩具パーサーをテスト/ショーケースするためのProgram.csの最後のテスト)

'HTH!

1

まだ初期段階にあるが、私は反射を排除し、4

チェックアウトCGbR JSON targetの要因により、直列化復元を高速化Json.NETの上にコードジェネレータを構築します。

[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; 
} 
関連する問題