【问题标题】:newtonsoft json deserialization error handling: partial deserializationnewtonsoft json 反序列化错误处理:部分反序列化
【发布时间】:2016-09-08 06:41:46
【问题描述】:

有没有办法反序列化无效的json?

例如,下一个 JSON 反序列化将失败并显示 JsonReaderException

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

因为options 属性值无效。

即使options 值无效,是否有一种很好的方法来获取sessionIdcommandId 值?

我知道在反序列化期间可以处理错误 (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

【问题讨论】:

  • 我不认为 Json.NET 可以处理无效的 Json。如果您想解析不是 Json 的内容,请查看 this answer

标签: c# .net json json.net


【解决方案1】:

您可以使用JsonReader 完成此操作。

示例代码:

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

using (var reader = new JsonTextReader(new StringReader(yourJsonString)))
{
    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
    }
}

请注意,当JsonReader 遇到无效字符时,try..catch 会在 reader.Read() 上抛出 JsonReaderException

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    相关资源
    最近更新 更多