2010-02-15 24 views
7

इम एक खिड़कियों फार्म में JSON.NET ढांचे का उपयोग करने के लिए JSON स्ट्रिंग से कुछ जानकारी को पढ़ने के लिए कोशिश कर रहा। लेकिन 'taxonomies-> विषयों' सरणी से शब्दकोश पाने के लिए संघर्ष कर im और 'समूहों'JSON.NET वस्तुओं

{ 
    "keywords": { 
     "anyString": [ 

     ], 
     "allString": { 
      "a5349f533e3aa3ccbc27de2638da38d6": "olympics" 
     }, 
     "exactString": [ 

     ], 
     "notString": [ 

     ], 
     "highlightString": [ 

     ] 
    }, 
    "dates": { 
     "startDate": "15-01-2008", 
     "endDate": "15-09-2009", 
     "useDates": true 
    }, 
    "clusters": { 
     "permission": { 
      "1": "private\/n" 
     } 
    }, 
    "taxonomies": { 
     "Topics": { 
      "2488": "Olympics 2012 (not participation)", 
      "8876": "Olympics and culture" 
     }, 
     "Keywords": { 
      "8848": "Engineering in the Olympics" 
     } 
    }, 
    "sort": { 
     "sortId": 1, 
     "sortType": 2, 
     "sort": "datetime", 
     "sortOrder": "descending" 
    } 
} 

कोड के साथ bellow मैं जानकारी के कुछ पढ़ने के लिए सक्षम है।

JObject searchCriteria = JObject.Parse(contentSearchCriteria); 
//search criteria 
IEnumerable<string> allString = searchCriteria["keywords"]["allString"].Children().Values<string>(); 
IEnumerable<string> anyString = searchCriteria["keywords"]["anyString"].Children().Values<string>(); 
IEnumerable<string> notString = searchCriteria["keywords"]["notString"].Children().Values<string>(); 
IEnumerable<string> exactString = searchCriteria["keywords"]["exactString"].Children().Values<string>(); 
IEnumerable<string> highlightString = searchCriteria["keywords"]["highlightString"].Children().Values<string>(); 
//dates 
string startDate = (string)searchCriteria["dates"]["startDate"]; 
string endDate = (string)searchCriteria["dates"]["endDate"]; 
bool useDates = (bool)searchCriteria["dates"]["useDates"]; 

//sort 
int sortId = (int)searchCriteria["sort"]["sortId"]; 
int sortType = (int)searchCriteria["sort"]["sortType"]; 
string sort = (string)searchCriteria["sort"]["sort"]; 
string sortOrder = (string)searchCriteria["sort"]["sortOrder"]; 

अद्यतन:

के रूप में सिफारिश की मैं

class SMSearchCriteria 
    { 
     public SMKeywords keywords { get; set; } 
     public SMDates dates { get; set; } 
     public SMClusters clusters { get; set; } 
     public SMTaxonomies taxonomies { get; set; } 
     public SMSort sort { get; set; } 
    } 

    class SMKeywords 
    { 
     public List<Dictionary<string, string>> AnyString {get; set;} 
     public List<Dictionary<string, string>> AllString { get; set; } 
     public List<Dictionary<string, string>> ExactString { get; set; } 
     public List<Dictionary<string, string>> NotString { get; set; } 
     public List<Dictionary<string, string>> HighlightString { get; set; } 
    } 

    class SMDates 
    { 
     public string startDate { get; set; } 
     public string endDate { get; set; } 
     public bool useDates { get; set; } 
    } 

    class SMClusters 
    { 
     List<SMCluster> cluster; 
    } 

    class SMCluster 
    { 
     public Dictionary<string, string> cluster { get; set; } 
    } 

    class SMTaxonomies 
    { 
     public List<SMTaxonomy> taxonomies { get; set; } 
    } 

    class SMTaxonomy 
    { 
     public Dictionary<string, List<SMCategory>> taxonomy { get; set; } 
    } 

    class SMCategory 
    { 
     public Dictionary<int, string> category { get; set; } 
    } 

    class SMSort 
    { 
     public int sortId { get; set; } 
     public int sortType { get; set; } 
     public string sort { get; set; } 
     public string sortOrder { get; set; } 
    } 

जोड़ा है, लेकिन जब मैं निष्पादित करें:

:

var mydata = JsonConvert.DeserializeObject<SMSearchCriteria>(contentSearchCriteria); 

मैं अपवाद मिल

अद्यतन 2:

के रूप में सुझाव दिया मैं सभी अतिरिक्त सूचियों को हटा दिया है और यह करने के लिए वर्ग को सरल बनाया:

class SearchMasterSearchCriteria 
    { 
     public SMKeywords keywords { get; set; } 
     public SMDates dates { get; set; } 
     public Dictionary<string, Dictionary<int, string>> clusters { get; set; } 
     public Dictionary<string, Dictionary<int, string>> taxonomies { get; set; } 
     public SMSort sort { get; set; } 
    } 

    class SMKeywords 
    { 
     public Dictionary<string, string> anyString {get; set;} 
     public Dictionary<string, string> allString { get; set; } 
     public Dictionary<string, string> exactString { get; set; } 
     public Dictionary<string, string> notString { get; set; } 
     public Dictionary<string, string> highlightString { get; set; } 
    } 

    class SMDates 
    { 
     public string startDate { get; set; } 
     public string endDate { get; set; } 
     public bool useDates { get; set; } 
    } 

    class SMSort 
    { 
     public int sortId { get; set; } 
     public int sortType { get; set; } 
     public string sort { get; set; } 
     public string sortOrder { get; set; } 
    } 

मैं यह भी कहा परीक्षण कोड इस तरह वस्तु को क्रमानुसार करने:

//criteria 
      SearchMasterSearchCriteria smCriteria = new SearchMasterSearchCriteria(); 

      //keywords 
      SMKeywords smKeywords = new SMKeywords(); ; 
      Dictionary<string, string> dict = new Dictionary<string, string>(); 
      dict.Add("a5349f533e3aa3ccbc27de2638da38d6", "olympics"); 
      dict.Add("9cfa7aefcc61936b70aaec6729329eda", "games"); 
      smKeywords.allString = dict; 

      //category 
      Dictionary<int, string> categorieDict = new Dictionary<int, string>(); 
      categorieDict.Add(2488, "Olympics 2012 (not participation)"); 
      categorieDict.Add(8876, "Olympics and culture"); 

      //taxonomies 
      Dictionary<string, Dictionary<int, string>> taxonomiesDict = new Dictionary<string, Dictionary<int, string>>(); 
      taxonomiesDict.Add("Topics", categorieDict); 

      //metadata 
      Dictionary<int, string> metadataDict = new Dictionary<int, string>(); 
      metadataDict.Add(1, @"private/n"); 

      //clusters 
      Dictionary<string, Dictionary<int, string>> clustersDict = new Dictionary<string, Dictionary<int, string>>(); 
      clustersDict.Add("permission", metadataDict); 


      //dates 
      SMDates smDates = new SMDates(); 
      smDates.startDate = "15-01-2008"; 
      smDates.endDate = "15-09-2009"; 
      smDates.useDates = true; 

      //sort 
      SMSort smSort = new SMSort(); 
      smSort.sortId = 1; 
      smSort.sortType = 2; 
      smSort.sort = "datetime"; 
      smSort.sortOrder = "descending"; 

      //add to criteria. 
      smCriteria.keywords = smKeywords; 
      smCriteria.clusters = clustersDict; 
      smCriteria.taxonomies = taxonomiesDict; 
      smCriteria.dates = smDates; 
      smCriteria.sort = smSort; 

      //serialize 
      string json = JsonConvert.SerializeObject(smCriteria); 
      var mydata1 = JsonConvert.DeserializeObject<SearchMasterSearchCriteria>(json); 

उस समय तक 2 json तार जहां के बीच फर्क सिर्फ इतना है। [] और anyString, exactString, आदि के लिए nulls तो मैं घुंघराले लोगों के लिए खाली वर्ग कोष्ठक की जगह है और इसे कोई त्रुटि :)

contentSearchCriteria = contentSearchCriteria.Replace("[]", "{}"); 
var mydata = JsonConvert.DeserializeObject<SearchMasterSearchCriteria>(contentSearchCriteria); 

उत्तर

9

आप के साथ ईमानदारी से कहूं तो मैं वे जिस तरह से ऐसा नहीं करेंगे साथ desearialized आप इसे बिल्कुल कर रहे हैं। डेटा को पुनर्प्राप्त करने के तरीके के बारे में यहां बताया गया है:

class Data { 
    Dictionary<string, Dictionary<string, string>> keywords; 
    DatesClass dates; 
    ....... 

} 

class DatesClass 
{ 
    string startDate; 
    string endDate; 
    bool? useDates 

} 


var mydata = JsonConvert.DeserializeObject<Data>(jsonstring); 

मैंने पूरी डेटा कक्षा को भर नहीं दिया, लेकिन आपको बिंदु मिल गया। मुझे आपके इनपुट डेटा की संरचना में ऑब्जेक्ट बनाने के लिए बहुत आसान लगता है और फिर डेटा भरने के लिए DeserializeObject विधि का उपयोग करें। यह कोड को अधिक क्लीनर बनाता है, और कंपाइलर को टाइपोज़ की जांच करने की अनुमति देता है।

+0

हाय टिमोथी को मैप किया जा रहा है, मैं वर्गों के साथ प्रश्न के रूप में आप का सुझाव दिया अद्यतन किया है। लेकिन मुझे अपवाद मिल रहा है। –

1

मैं एक जोरदार टाइप डीटीओ वर्ग पहले अधिमानतः एक DataContract कि जिस तरह से आप पसंद किसी भी प्रारूप आप चाहते हैं, यानी JSON, एक्सएमएल, Protobuf करने के लिए इसे पाने के क्रमानुसार करने, आदि

नोट के साथ शुरू होगा: JSON है वास्तव में अन्य प्रारूपों की तुलना में धारावाहिक/डी-सीरियलाइज़ करने में बहुत धीमी गति से (देखें: serialization benchmarks - JSON.NET 'न्यूटन सॉफ्ट.जसन' है) यदि आप वेब ऐप के बजाय एक समृद्ध क्लाइंट ऐप कर रहे हैं तो आप चाहें एक अलग धारावाहिक प्रारूप का चयन करें। भले ही आप किस प्रारूप के साथ समाप्त हो जाएं, फिर भी आप उसी डीटीओ का पुनः उपयोग कर सकते हैं, उदा।

[DataContract] 
public class MyDto 
{ 
    [DataMember] 
    public Keywords keywords { get; set; } 
} 

[DataContract] 
public class Keywords 
{ 
    [DataMember] 
    public List<string> anyString { get; set; } 

    [DataMember] 
    public Dictionary<string,string> allString { get; set; } 

    [DataMember] 
    public List<string> exactString { get; set; } 

    [DataMember] 
    public List<string> notString { get; set; } 

    [DataMember] 
    public List<string> highlightString { get; set; } 
} 

var dto = new MyDto { Keywords = { allString = {{"a5349f533e3aa3ccbc27de2638da38d6", "olympics"}} }; 

var json = JsonConvert.SerializeObject(dto); 
var fromJson = JsonConvert.DeserializeObject<MyDto>(json); 

संपादित करें:: जोड़ा लिंक

ऐसा लगता है कि आप JSON.NET के साथ समस्याओं जिस स्थिति में आप अन्य JSON नेट serializers प्रयास करना चाहिए हो रही है/डी अपने कोड से ऊपर होता तरह दिखता है -serializers। माइक्रोसॉफ्ट एक प्रणाली जहाज।रनटाइम। Serialization.Json.DataContractJsonSerializer .NET v3.5 में शामिल है। यहां कुछ सहायक वर्ग दिए गए हैं जो आपको दिखाते हैं कि serialize और de-serialize JSON कैसे करें।

Jayrock .NET के लिए एक और JSON serializer है लेकिन यह बाकी की तुलना में धीमा है और मुझे लगता है कि यह जेनेरिक के लिए अच्छा समर्थन नहीं है।

+0

मुझे उस सिस्टम से JSON प्राप्त होता है जिस पर मेरा नियंत्रण नहीं है। मैंने नए वर्गों के साथ सवाल अपडेट किया है लेकिन मुझे अपवाद मिल रहा है। –

+0

ठीक है, तो आप शब्दकोश के स्ट्रिंग्स, स्ट्रिंग, स्ट्रिंग> और सूची के गुणों के साथ एक कम टाइप किए गए डीटीओ मॉडल को बनाने में सक्षम हो सकते हैं? – mythz

+0

क्या आप मुझे एक उदाहरण दे सकते हैं? json.net कैसे पता चलेगा कि कौन से गुण मैप करना चाहते हैं? –

2

हाँ, आपकी समस्या अब JSON.net वस्तुओं को deserializes रास्ते में है। JSON.net में एक सी # कक्षा एक जेसन ऑब्जेक्ट बन जाती है। और उस वर्ग का एक सदस्य सदस्य बनने के मूल्य के साथ एक कुंजी बन जाता है।

चलिए एक उदाहरण के रूप में वर्गीकरण पथ का उदाहरण लें। अपने ऊपर वर्ग परिभाषा का उपयोग JSON.net इस प्रारूप में JSON डेटा की तलाश में है:

{"taxonomies": {"taxonomies":[{"taxonomy": {"Topics": {1212, "foo"}}}]} 

यह पूरी तरह से अपना इनपुट डेटा की तरह कुछ भी लग रहा है।

जब आप अपनी वस्तुएं बना रहे हैं तो इस तरह से सोचें।

1) एक बेस ऑब्जेक्ट जेसन कोड में {} बनाता है। 2) एक शब्दकोश जेसन कोड में {} बनाता है। 3) एक सूची एक [] json कोड 4 में) एक वर्ग के हर सदस्य json कोड

क्या इस डिबग करने के लिए आप अपने संरचना बनाने के लिए है के लिए मदद कर सकता है की में एक प्रविष्टि {} बनाता है बनाता है, कुछ अस्थायी डेटा भरें, फिर जेसन कॉनवर्ट का उपयोग करें। सरलीकृत (myobj) आपको यह दिखाने के लिए कि जेएसओएन क्या सोचता है कि संरचना कैसी दिखाई देगी।

मुझे लगता है कि आपका अपवाद कई वर्गों के रास्ते से आता है।

class SMSearchCriteria 
{ 
     public SMKeywords keywords { get; set; } 
     public SMDates dates { get; set; } 
     public SMClusters clusters { get; set; } 
     public SMTaxominies taxonomies { get; set; } 
     public SMSort sort { get; set; } 
} 

class SMTaxominies 
{ 
    public Dictionary<string, string> Topics; 
    public Keywords<string, string> Keywords; 
} 
0

तुम क्यों Json करने के लिए LINQ का उपयोग नहीं करते:

यह संभव है कि आप अपने कोड की taxominies भाग की तरह लग रहे करना चाहते हैं?

उदाहरण के लिए, अपने "प्रकार" नोड्स अपनी कक्षा

var jsonResult = JObject.Parse(jsonString); 

var sortItem = from s in jsonResult["sort"] 
select new MySortObject{ 
          SortId = s.Value<int>("sortId") 
         }; 

http://www.newtonsoft.com/json/help/html/QueryJsonLinq.htm