2016-09-08 191 views
0

是否有反序列化無效json的方法?newtonsoft json反序列化錯誤處理:部分反序列化

比如未來JSON反序列化將失敗,JsonReaderException

{ 
'sessionId': 's0j1', 
'commandId': 19, 
'options': invalidValue // invalid value 
} 

因爲options屬性值是無效的。

有沒有一種很好的方法可以獲得sessionIdcommandId值,即使options的值無效?

我知道這是可能的反序列化(http://www.newtonsoft.com/json/help/html/SerializationErrorHandling.htm)期間處理錯誤

var json = "{'sessionId': 's0j1', 'commandId': 19, 'options': invalidValue}"; 

var settings = new JsonSerializerSettings 
{ 
    Error = delegate(object sender, ErrorEventArgs args) 
    { 
     args.ErrorContext.Handled = true; 
    } 
}); 
var result = JsonConvert.DeserializeObject(json, settings); 

位將導致result = null

+0

我不認爲Json.NET可以處理無效JSON。如果你想解析一些不是Json的東西,請看看[這個答案](http://stackoverflow.com/a/29146482/579895) – Pikoh

回答

2

您可以使用JsonReader

示例代碼:

var result = new Dictionary<string, object>(); 

using (var reader = new JsonTextReader(new StringReader(yourJsonStr)) 
{ 
    var lastProp = string.Empty; 
    try 
    { 
     while (reader.Read()) 
     { 
      if (reader.TokenType == JsonToken.PropertyName) 
      { 
       lastProp = reader.Value.ToString(); 
      } 

      if (reader.TokenType == JsonToken.Integer || 
       reader.TokenType == JsonToken.String) 
      { 
       result.Add(lastProp, reader.Value); 
      } 
     } 
    } 
    catch(JsonReaderException jre) 
    { 
     //do anything what you want with exception 
    } 
} 

注意,有try..catch塊當JsonReader滿足它拋出JsonReaderException無效字符上reader.Read()