2016-09-08 186 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()