2011-09-24 22 views
15

मैं .NET (http://code.google.com/p/jsonpath/downloads/list) के लिए जेसनपाथ का उपयोग करने की कोशिश कर रहा हूं और मुझे एक जेसन स्ट्रिंग और जेसनपाथ स्ट्रिंग को पार्स करने और परिणाम प्राप्त करने का उदाहरण खोजने में परेशानी हो रही है।जेसनपाथ का उपयोग कर सी # उदाहरण का उपयोग कैसे करें?

क्या किसी ने इसका इस्तेमाल किया है?

+4

मैं Json.NET एक वैकल्पिक JSON के रूप में सुझाव दे सकता है पार्सर (http://james.newtonking.com/pages/json-net.aspx) –

+0

क्या इसमें जेसनपाथ की तरह एक सुविधा है? –

+3

XPath के समान कुछ? ऐसा होता है। JSON.NET की SelectToken कार्यक्षमता देखें। आप JSON प्राप्त करने के लिए एक स्ट्रिंग अभिव्यक्ति का उपयोग कर सकते हैं। उदाहरण के लिए: http: // stackoverflow।com/प्रश्न/1698175/what-is-the-json-net-equivilant-of-xmls-xpath-selectnodes-selectsinglenode –

उत्तर

21

आप जिस समस्या का सामना कर रहे हैं वह यह है कि जेसनपाथ के सी # संस्करण में जेसन पार्सर शामिल नहीं है, इसलिए आपको इसे अन्य जेसन फ्रेमवर्क के साथ उपयोग करना होगा जो क्रमबद्धता और deserialization को संभालने में सक्षम है।

जेसनपाथ काम करता है जिस तरह से पार्स किए गए जेसन ऑब्जेक्ट्स को पार करने के लिए IJsonPathValueSystem नामक एक इंटरफ़ेस का उपयोग करना है। जेसनपाथ एक अंतर्निहित BasicValueSystem के साथ आता है जो जेसन ऑब्जेक्ट्स का प्रतिनिधित्व करने के लिए जेसन ऑब्जेक्ट्स और IList इंटरफ़ेस का प्रतिनिधित्व करने के लिए IDictionary इंटरफ़ेस का उपयोग करता है।

आप अपने स्वयं के BasicValueSystem-संगत जेसन ऑब्जेक्ट्स को सी # संग्रह प्रारंभकर्ताओं का उपयोग करके बनाकर बना सकते हैं, लेकिन उदाहरण के लिए, जब आपका जेसन रिमोट सर्वर से तारों के रूप में आ रहा है तो इसका अधिक उपयोग नहीं है।

तो अगर आप केवल जेसन स्ट्रिंग ले सकते हैं और इसे IDictionary ऑब्जेक्ट्स, IList सरणी और आदिम मानों की घोंसला वाली संरचना में पार्स कर सकते हैं, तो आप इसे फ़िल्टर करने के लिए जेसनपाथ का उपयोग कर सकते हैं! भाग्य के रूप में, हम जेसन.NET का उपयोग कर सकते हैं जिसमें नौकरी के उस हिस्से को करने के लिए अच्छी क्रमबद्धता और deserialization क्षमताओं है।

दुर्भाग्यवश, जेसन.NET BasicValueSystem के साथ संगत प्रारूप में जेसन स्ट्रिंग को बेकार नहीं करता है। इसलिए जेसनपैथ के साथ जेसनपैथ का उपयोग करने का पहला कार्य JsonNetValueSystem लिखना है जो IJsonPathValueSystem लागू करता है और JObject ऑब्जेक्ट्स, JArray सरणी, और JValue मानों को JObject.Parse मानता है।

तो जेसनपाथ और जेसननेट दोनों को डाउनलोड करें और उन्हें सी # प्रोजेक्ट में डाल दें।

public sealed class JsonNetValueSystem : IJsonPathValueSystem 
{ 
    public bool HasMember(object value, string member) 
    { 
     if (value is JObject) 
       return (value as JObject).Properties().Any(property => property.Name == member); 
     if (value is JArray) 
     { 
      int index = ParseInt(member, -1); 
      return index >= 0 && index < (value as JArray).Count; 
     } 
     return false; 
    } 

    public object GetMemberValue(object value, string member) 
    { 
     if (value is JObject) 
     { 
      var memberValue = (value as JObject)[member]; 
      return memberValue; 
     } 
     if (value is JArray) 
     { 
      int index = ParseInt(member, -1); 
      return (value as JArray)[index]; 
     } 
     return null; 
    } 

    public IEnumerable GetMembers(object value) 
    { 
     var jobject = value as JObject; 
     return jobject.Properties().Select(property => property.Name); 
    } 

    public bool IsObject(object value) 
    { 
     return value is JObject; 
    } 

    public bool IsArray(object value) 
    { 
     return value is JArray; 
    } 

    public bool IsPrimitive(object value) 
    { 
     if (value == null) 
      throw new ArgumentNullException("value"); 

     return value is JObject || value is JArray ? false : true; 
    } 

    private int ParseInt(string s, int defaultValue) 
    { 
     int result; 
     return int.TryParse(s, out result) ? result : defaultValue; 
    } 
} 
सभी तीन इन टुकड़ों को हम एक नमूना JsonPath कार्यक्रम लिख सकते हैं की साथ

अब:: तब कि इस परियोजना के लिए इस वर्ग को जोड़ने के

class Program 
{ 
    static void Main(string[] args) 
    { 
     var input = @" 
       { ""store"": { 
        ""book"": [ 
         { ""category"": ""reference"", 
          ""author"": ""Nigel Rees"", 
          ""title"": ""Sayings of the Century"", 
          ""price"": 8.95 
         }, 
         { ""category"": ""fiction"", 
          ""author"": ""Evelyn Waugh"", 
          ""title"": ""Sword of Honour"", 
          ""price"": 12.99 
         }, 
         { ""category"": ""fiction"", 
          ""author"": ""Herman Melville"", 
          ""title"": ""Moby Dick"", 
          ""isbn"": ""0-553-21311-3"", 
          ""price"": 8.99 
         }, 
         { ""category"": ""fiction"", 
          ""author"": ""J. R. R. Tolkien"", 
          ""title"": ""The Lord of the Rings"", 
          ""isbn"": ""0-395-19395-8"", 
          ""price"": 22.99 
         } 
        ], 
        ""bicycle"": { 
         ""color"": ""red"", 
         ""price"": 19.95 
        } 
       } 
      } 
     "; 
     var json = JObject.Parse(input); 
     var context = new JsonPathContext { ValueSystem = new JsonNetValueSystem() }; 
     var values = context.SelectNodes(json, "$.store.book[*].author").Select(node => node.Value); 
     Console.WriteLine(JsonConvert.SerializeObject(values)); 
     Console.ReadKey(); 
    } 
} 

जो इस उत्पादन का उत्पादन:

["Nigel Rees","Evelyn Waugh","Herman Melville","J. R. R. Tolkien"] 

यह उदाहरण जेसनपैथ साइट पर जावास्क्रिप्ट नमूना पर आधारित है:

+2

बहुत सारे कोड लिखने और दो पुस्तकालयों का उपयोग करने के बजाय, बस Json.Net का उपयोग करना आसान नहीं होगा: जॉब्जेक्ट जेसन = जॉब्जेक्ट.पर्स (@ इनपुट); var values ​​= json.SelectToken ("store.book")। मान ("लेखक"); –

+0

यह उत्तर प्रश्न का उत्तर देता है। समस्या हल होने के आधार पर निश्चित रूप से कई अन्य दृष्टिकोण हैं। –

+0

धन्यवाद! वास्तव में मुझे क्या चाहिए। Json.Net's SelectToken में मुझे आवश्यक कार्यक्षमता नहीं है। –

2

उन है कि LINQ (.NET 2.0) पसंद नहीं है के लिए:

namespace JsonPath 
{ 


    public sealed class JsonNetValueSystem : IJsonPathValueSystem 
    { 


     public bool HasMember(object value, string member) 
     { 
      if (value is Newtonsoft.Json.Linq.JObject) 
      { 
       // return (value as JObject).Properties().Any(property => property.Name == member); 

       foreach (Newtonsoft.Json.Linq.JProperty property in (value as Newtonsoft.Json.Linq.JObject).Properties()) 
       { 
        if (property.Name == member) 
         return true; 
       } 

       return false; 
      } 

      if (value is Newtonsoft.Json.Linq.JArray) 
      { 
       int index = ParseInt(member, -1); 
       return index >= 0 && index < (value as Newtonsoft.Json.Linq.JArray).Count; 
      } 
      return false; 
     } 


     public object GetMemberValue(object value, string member) 
     { 
      if (value is Newtonsoft.Json.Linq.JObject) 
      { 
       var memberValue = (value as Newtonsoft.Json.Linq.JObject)[member]; 
       return memberValue; 
      } 
      if (value is Newtonsoft.Json.Linq.JArray) 
      { 
       int index = ParseInt(member, -1); 
       return (value as Newtonsoft.Json.Linq.JArray)[index]; 
      } 
      return null; 
     } 


     public System.Collections.IEnumerable GetMembers(object value) 
     { 
      System.Collections.Generic.List<string> ls = new System.Collections.Generic.List<string>(); 

      var jobject = value as Newtonsoft.Json.Linq.JObject; 
      /// return jobject.Properties().Select(property => property.Name); 

      foreach (Newtonsoft.Json.Linq.JProperty property in jobject.Properties()) 
      { 
       ls.Add(property.Name); 
      } 

      return ls; 
     } 


     public bool IsObject(object value) 
     { 
      return value is Newtonsoft.Json.Linq.JObject; 
     } 


     public bool IsArray(object value) 
     { 
      return value is Newtonsoft.Json.Linq.JArray; 
     } 


     public bool IsPrimitive(object value) 
     { 
      if (value == null) 
       throw new System.ArgumentNullException("value"); 

      return value is Newtonsoft.Json.Linq.JObject || value is Newtonsoft.Json.Linq.JArray ? false : true; 
     } 


     private int ParseInt(string s, int defaultValue) 
     { 
      int result; 
      return int.TryParse(s, out result) ? result : defaultValue; 
     } 


    } 


} 

उपयोग:

object obj = Newtonsoft.Json.JsonConvert.DeserializeObject(input); 

JsonPath.JsonPathContext context = new JsonPath.JsonPathContext { ValueSystem = new JsonPath.JsonNetValueSystem() }; 

foreach (JsonPath.JsonPathNode node in context.SelectNodes(obj, "$.store.book[*].author")) 
{ 
    Console.WriteLine(node.Value); 
} 
संबंधित मुद्दे