आप जिस समस्या का सामना कर रहे हैं वह यह है कि जेसनपाथ के सी # संस्करण में जेसन पार्सर शामिल नहीं है, इसलिए आपको इसे अन्य जेसन फ्रेमवर्क के साथ उपयोग करना होगा जो क्रमबद्धता और 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"]
यह उदाहरण जेसनपैथ साइट पर जावास्क्रिप्ट नमूना पर आधारित है:
मैं Json.NET एक वैकल्पिक JSON के रूप में सुझाव दे सकता है पार्सर (http://james.newtonking.com/pages/json-net.aspx) –
क्या इसमें जेसनपाथ की तरह एक सुविधा है? –
XPath के समान कुछ? ऐसा होता है। JSON.NET की SelectToken कार्यक्षमता देखें। आप JSON प्राप्त करने के लिए एक स्ट्रिंग अभिव्यक्ति का उपयोग कर सकते हैं। उदाहरण के लिए: http: // stackoverflow।com/प्रश्न/1698175/what-is-the-json-net-equivilant-of-xmls-xpath-selectnodes-selectsinglenode –