2016-01-09 10 views
15

मैं एक विंडोज फोन 8.1 आवेदन स्थान पर काम कर रहा हूं। मुझे अपने एपीआई से जेसन डेटा प्राप्त हो रहा है। मेरे एपीआई रिटर्न डेटा है कि लगता है कि:जेसन रीडर से जॉब्जेक्ट पढ़ने में त्रुटि। वर्तमान जेसन रीडर आइटम एक ऑब्जेक्ट नहीं है: StartArray। पथ

[{ 
    "country": "India", 
    "city": "Mall Road, Gurgaon", 
    "area": "Haryana", 
    "PLZ": "122002", 
    "street": "", 
    "house_no": "", 
    "POI": "", 
    "type": "17", 
    "phone": "", 
    "lng": 77.08972334861755, 
    "lat": 28.47930118040612, 
    "formatted_address": "Mall Road, Gurgaon 122002, Haryana, India" 
}, 
{ 
    "country": "India", 
    "city": "Mall Road, Kanpur", 
    "area": "Uttar Pradesh", 
    "PLZ": "208004", 
    "street": "", 
    "house_no": "", 
    "POI": "", 
    "type": "17", 
    "phone": "", 
    "lng": 80.35783410072327, 
    "lat": 26.46026740300029, 
    "formatted_address": "Mall Road, Kanpur 208004, Uttar Pradesh, India" 
}, 
{ 
    "country": "India", 
    "city": "Mall Road Area, Amritsar", 
    "area": "Punjab", 
    "PLZ": "143001", 
    "street": "", 
    "house_no": "", 
    "POI": "", 
    "type": "17", 
    "phone": "", 
    "lng": 74.87286686897278, 
    "lat": 31.64115178002094, 
    "formatted_address": "Mall Road Area, Amritsar 143001, Punjab, India" 
}, 
{ 
    "country": "India", 
    "city": "Vasant Kunj (Mall Road Kishan Garh), New Delhi", 
    "area": "Delhi", 
    "PLZ": "110070", 
    "street": "", 
    "house_no": "", 
    "POI": "", 
    "type": "18", 
    "phone": "", 
    "lng": 77.1434211730957, 
    "lat": 28.51363217008815, 
    "formatted_address": "Vasant Kunj (Mall Road Kishan Garh), New Delhi 110070, Delhi, India" 
}] 

मैं अपने JSON डेटा deserializing कर रहा हूँ और यह LocationData नाम के एक वर्ग में डाल। जब मैं अपना कोड चलाता हूं, तो यह मुझे एक त्रुटि देता है:

Error reading JObject from JsonReader. Current JsonReader item is not an object: StartArray. Path

मैं गलत कहां जा रहा हूं? यहां मेरा कोड है:

private async void GetAPIData() 
    { 
     string _serviceUrl = "https://api.myweblinkapiprovider/v2&q=" + UserRequestedLocation; 
     HttpClient client = new HttpClient(); 

     HttpResponseMessage responce = await client.GetAsync(new Uri(_serviceUrl)); 

     if (responce.Content != null) 
     { 
      var respArray = JObject.Parse(await responce.Content.ReadAsStringAsync()); 
      JsonSerializerSettings settings = new JsonSerializerSettings(); 
      settings.NullValueHandling = NullValueHandling.Ignore; 
      settings.MissingMemberHandling = MissingMemberHandling.Ignore; 
      var rcvdData = JsonConvert.DeserializeObject<LocationData>(respArray.ToString(), settings); 
      UpdateMapData(rcvdData); 
      UpdateTextData(rcvdData); 
     } 
    } 

मैंने एक जेएरे का उपयोग करने की भी कोशिश की।

private async void GetAPIData() 
    { 
     string _serviceUrl = "https://api.myweblinkprovider.com/v3?fun=geocode&lic_key=MyKey" + UserRequestedLocation; 
     HttpClient client = new HttpClient(); 

     HttpResponseMessage responce = await client.GetAsync(new Uri(_serviceUrl)); 

     JArray arr = JArray.Parse(await responce.Content.ReadAsStringAsync()); 

     foreach (JObject obj in arr.Children<JObject>()) 
     { 
      JsonSerializerSettings settings = new JsonSerializerSettings(); 
      settings.NullValueHandling = NullValueHandling.Ignore; 
      settings.MissingMemberHandling = MissingMemberHandling.Ignore; 
      var rcvdData = JsonConvert.DeserializeObject<LocationData>(arr.ToString(), settings); 
      UpdateMapData(rcvdData); 
      UpdateTextData(rcvdData); 
     } 
    } 

यह भी मुझे एक त्रुटि देता है: नीचे के रूप में मेरे कोड है

Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'MMI_SpeechRecog.Model.LocationData' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.

उत्तर

33

अपने प्रश्न के पहले भाग Why do I get a JsonReaderException with this code? का डुप्लिकेट है, लेकिन वह (मेरे) जवाब से सबसे अधिक प्रासंगिक हिस्सा यह है:

[A] JObject isn't the elementary base type of everything in JSON.net, but JToken is. So even though you could say,

object i = new int[0]; 

in C#, you can't say,

JObject i = JObject.Parse("[0, 0, 0]"); 

in JSON.net.

तुम क्या चाहते JArray.Parse, जो सरणी आप इसे पारित कर रहे हैं (अपने एपीआई जवाब में उद्घाटन [ से चिह्नित) स्वीकार करेगा। त्रुटि संदेश में "StartArray" यही है जो आपको बता रहा है।

क्या हुआ जब आप JArray इस्तेमाल किया है, तो आप arr बजाय obj उपयोग कर रहे हैं के लिए के रूप में:

var rcvdData = JsonConvert.DeserializeObject<LocationData>(arr /* <-- Here */.ToString(), settings); 

स्वैप कि, और मेरा मानना ​​है कि यह काम करना चाहिए।

हालांकि मैं arr को IEnumerable<LocationData> के रूप में सीधे deserialize करने के लिए लुभाना होगा, जो सरणी के माध्यम से लूपिंग के कुछ कोड और प्रयास को बचाएगा। यदि आप अलग-अलग संस्करण का उपयोग अलग-अलग नहीं कर रहे हैं, तो इससे बचने के लिए सबसे अच्छा है।

+1

जवाब के लिए धन्यवाद का उपयोग कर पहला आइटम पार्स। मैं अलग-अलग विश्लेषण डेटा का उपयोग करूँगा। इस मामले में उसने 4 खोज मैचों के साथ जवाब दिया। मुझे उन्हें व्यक्तिगत रूप से प्रदर्शित करने की आवश्यकता है और फिर उपयोगकर्ता की वरीयता के आधार पर प्रत्येक के लिए पृष्ठभूमि को पूरा करने की आवश्यकता है। –

+0

मुझे लगता है कि यदि आप सभी मामलों का समर्थन करना चाहते हैं तो आपको JToken का उपयोग करना चाहिए, यहां उनके स्रोत कोड देखें: http://www.jsonschemavalidator.net/ –

3

मैं अपने ज़ैमरिन विंडोज फोन 8.1 ऐप के साथ एक बहुत ही समान समस्या में भाग गया। जॉब्जेक्ट का कारण। पर्स (जेसन) मेरे लिए काम नहीं करेगा क्योंकि मेरी जेसन की शुरुआत "[" और एक अंत "] थी। इसे काम करने के लिए, मुझे उन दो पात्रों को हटाना पड़ा। आपके उदाहरण से, ऐसा लगता है कि आपके पास एक ही समस्या हो सकती है।

jsonResult = jsonResult.TrimStart(new char[] { '[' }).TrimEnd(new char[] { ']' }); 

मैं जॉबजेक्ट.पर्स (जेसनआरसल्ट) और सब कुछ काम करने में सक्षम था।

+1

सहायता के लिए धन्यवाद। यद्यपि वे मेरे टेक्स्ट फ़ाइल में बस मेरे द्वारा रखे गए थे। मुझे उन्हें हटा देना चाहिए था। –

5

इस मामले में आप जानते हैं कि आप सरणी पर पहली जगह में सभी आइटम है कि आप JArray को स्ट्रिंग पार्स कर सकते हैं और फिर JObject.Parse

var jsonArrayString = @" 
[ 
    { 
    ""country"": ""India"", 
    ""city"": ""Mall Road, Gurgaon"", 
    }, 
    { 
    ""country"": ""India"", 
    ""city"": ""Mall Road, Kanpur"", 
    } 
]"; 
JArray jsonArray = JArray.Parse(jsonArrayString); 
dynamic data = JObject.Parse(jsonArray[0].ToString()); 
संबंधित मुद्दे