2012-04-14 16 views
14

錯了對象當我嘗試deserialise這個無效的JSON字符串(}]到底丟失):ServiceStack.Text JSON反序列化創建的,而不是扔無效JSON輸入字符串

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

通過這樣做:

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

的ServiceStack JSON解串器接受的字符串,但它產生了錯誤的對象,因爲我結束了具有這些值的C#對象:

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,答案是ServiceStack支持重啓,並且我可以在GitHub中提出請求。

這仍然是這種情況嗎?有沒有人已經做到了,省去了我的麻煩?否則,我的日程安排非常緊張,所以如果任何人有關於如何創建一個選項 - 使得ServiceStack拋出反序列化錯誤的選項標記或建議,請在這裏回覆,以便我可以更快地完成此操作。

+0

我看到你原來的職位,我同意你至少應該有一個選項,把嚴格JSON驗證上。通過切換回Newtonsoft序列化程序,我可以得到相同的結果。正如我的一個高校指出的那樣,如果我們使用彈性序列化,我們又回到了允許垃圾html在沒有錯誤的情況下進行分析的道路,因爲它允許草率的開發人員。 – Bronumski 2013-04-04 15:56:09

+0

這看起來像一個錯誤。你是否提出了[問題](https://github.com/ServiceStack/Issues/issues/new)? – jlyonsmith 2014-08-28 07:24:51

回答

0

說到JSON,C#有點挑剔。以下將是有效!注意我沒有匿名對象數組作爲默認元素。

{ 
    "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

我只是使用Newtonsoft.JsonT 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

我試着當我錯過了最後的時候,這是一個例外。

在C#中,JSON的格式是{「name」,「value」} not [{「name」,「value」}]。

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\"]}"; 

目的是反序列化細。

您可以看到該對象的JSON:

string s = JsonConvert.SerializeObject(m);