2012-04-14 11 views
14

पर फेंकने की गलत वस्तु बनाता है जब मैं इस अमान्य JSON स्ट्रिंग (}] अंत में लापता) deserialise करने की कोशिश:ServiceStack.Text json अक्रमांकन बजाय अमान्य JSON इनपुट स्ट्रिंग

:

[{"ExtId":"2","Name":"VIP sj�lland","Mobiles":["4533333333","4544444444"] 

ऐसा करने से

var result = JsonSerializer.DeserializeFromString<T>(str);  

ServiceStack json deserializer स्ट्रिंग को स्वीकार करता है, लेकिन यह एक गलत वस्तु बनाता है, क्योंकि मैं एक सी # वस्तु इन मूल्यों होने के साथ खत्म:

ExtId : "2"          // ok fine. 
Name: "VIP sj�lland"       // ok fine 
Mobiles: ["4533333333","4544444444", "544444444"]// Aarg! An array with 3 objects ?!? 
               // There were only two in the JSON string. 

इस मामले में खराब डेटा जारी रखने के बजाय अपवाद को फेंकना बेहतर होगा। इसलिए मैंने इसका उपयोग करने की कोशिश की:

JsConfig.ThrowOnDeserializationError = true; 

DeserializeFromString को कॉल करने से ठीक पहले, लेकिन कोई अपवाद नहीं फेंक दिया गया था। जनवरी में मैंने इस प्रश्न Configure ServiceStack.Text to throw on invalid JSON से पूछा और जवाब यह था कि सर्विसस्टैक लचीलापन का पक्ष ले रहा है और मैं गिटहब में एक पुल अनुरोध कर सकता हूं।

क्या यह अभी भी मामला है? और क्या किसी ने इसे पहले ही किया है, मुझे परेशानी बचा रही है? अन्यथा, मैं बहुत तंग कार्यक्रम पर हूं, इसलिए यदि किसी के पास deserialization त्रुटियों पर सर्विसस्टैक फेंकने के लिए विकल्प-ध्वज बनाने के लिए कुछ कोड या सुझाव हैं, तो कृपया यहां जवाब दें, ताकि मैं इसे तेज़ी से कर सकूं।

+0

मैं अपने मूल पोस्ट को देखा, मैं मानता हूँ आप कम से कम पर सख्त json सत्यापन चालू करने के लिए एक विकल्प होना चाहिए। मुझे न्यूटॉन्सॉफ्ट सीरियलाइज़र पर वापस स्विच करके एक ही परिणाम मिलते हैं। जैसा कि मेरे कॉलेजों में से एक ने बताया कि यदि हम लचीला क्रमिकरण का उपयोग करते हैं तो हम कचरा एचटीएमएल को त्रुटियों के बिना पार्स किए जाने की अनुमति देने के समान सड़क पर वापस जा रहे हैं जहां यह मैला डेवलपर्स की अनुमति देता है। – Bronumski

+0

यह सिर्फ एक बग की तरह दिखता है। क्या आपने [इसके लिए एक मुद्दा] दायर किया है (https://github.com/ServiceStack/Issues/issues/new)? – jlyonsmith

उत्तर

0

सी # जेएसओएन की बात आती है तो थोड़ा सा picky है। निम्नलिखित मान्य होगा! नोट: मेरे पास अज्ञात ऑब्जेक्ट सरणी डिफ़ॉल्ट तत्व के रूप में नहीं है।

{ 
    "ExtItem": [ 
     { 
      "ExtId": "2", 
      "Name": "VIPsj�lland", 
      "Mobiles": [ 
       "4533333333", 
       "4544444444" 
      ] 
     } 
    ] 
} 

तो मैं इस से एक POCO उत्पन्न मैं

public class Rootobject 
{ 
    public Extitem[] ExtItem { get; set; } 
} 

public class Extitem 
{ 
    public string ExtId { get; set; } 
    public string Name { get; set; } 
    public string[] Mobiles { get; set; } 
} 

मैं व्यक्तिगत रूप से स्ट्रिंग

public static class Extensions 
{ 
    public static bool DeserializeJson<T>(this String str, out T item) 
    { 
     item = default(T); 
     try 
     { 
      item = new JavaScriptSerializer().Deserialize<T>(str); 
      return true; 
     } 
     catch (Exception ex) 
     { 
      return false; 
     } 
    } 
} 

को विस्तार विधि का उपयोग करें यह मैं लिखने के लिए सक्षम होगा मिलती है:

Rootobject ext; 
const string validJson = @" 
{ 
    ""ExtItem"": [ 
     { 
      ""ExtId"":""2"", 
      ""Name"":""VIPsj�lland"", 
      ""Mobiles"":[ 
       ""4533333333"", 
       ""4544444444"" 
      ] 
     } 
    ] 
}"; 
if (validJson.DeserializeJson(out ext)) 
{ //valid input 
    // following would print 2 elements : 4533333333, 4544444444 
    Console.WriteLine(string.Join(", ", ext.ExtItem.First().Mobiles)); 
} //invalid input 
-1

मैं बसका उपयोग करता हूंT JsonConvert.DeserializeObject<T>(string value) और यह एक अपवाद फेंकता है;

अगर मैं object JsonConvert.DeserializeObject(string value) इस एक यह बस लापता }]

मैंने पाया कि यह एक बहुत ही विश्वसनीय और तेजी से पुस्तकालय है रखकर सही वस्तु बनाता है का उपयोग करें।

1

यह ServiceStack.Text v4 + में हल हो गई है जो डिफ़ॉल्ट रूप से अधूरा संग्रह, जैसे पॉप्युलेट नहीं करता है:

public class Poco 
{ 
    public string ExtId { get; set; } 
    public string Name { get; set; } 
    public string[] Mobiles { get; set; } 
} 

var json = "[{\"ExtId\":\"2\",\"Name\":\"VIP sj�lland\",\"Mobiles\":[\"4533333333\",\"4544444444\"]"; 

var dto = json.FromJson<Poco[]>(); 

Assert.That(dto[0].ExtId, Is.EqualTo("2")); 
Assert.That(dto[0].Name, Is.EqualTo("VIP sj�lland")); 
Assert.That(dto[0].Mobiles, Is.Null); 

या पसंदीदा त्रुटि पर फेंक कर सकते हैं यदि:

JsConfig.ThrowOnDeserializationError = true; 

Assert.Throws<SerializationException>(() => 
    json.FromJson<Poco[]>()); 
0

मैंने कोशिश की जब मैं अंत में} चूक गया तो यह अपवाद फेंक दिया गया है।

सी # में, JSON के लिए प्रारूप {"नाम", "मान"} नहीं है [{"नाम", "मान"}]।

class M 
     { 
      public string ExtId { get; set; } 
      public string Name { get; set; } 
      public List<string> Mobiles { get; set; } 
     } 

string str = "{\"ExtId\":\"2\",\"Name\":\"VIP\",\"Mobiles\":[\"4533333333\",\"4544444444\"]"; 

M m = JsonConvert.DeserializeObject<M>(str); 

इसे चलाने पर, आपको एक त्रुटि के रूप में त्रुटि मिल जाएगी।

का उपयोग करना:

string str = "{\"ExtId\":\"2\",\"Name\":\"VIP\",\"Mobiles\":[\"4533333333\",\"4544444444\"]}"; 

वस्तु deserialized ठीक है।

आप से इस वस्तु का JSON देख सकते हैं:

string s = JsonConvert.SerializeObject(m);