忽略c#自定义转换器上jObject ReadJson上引发的异常

忽略c#自定义转换器上jObject ReadJson上引发的异常,c#,json,json.net,deserialization,C#,Json,Json.net,Deserialization,我在尝试反序列化一些json时遇到了一些问题,因为它与来自服务器的未转义双引号混合在一起。由于我无法在服务器端解决这个问题,所以我尝试忽略有问题的json。为了做到这一点,我遵循了这些答案。当我使用errorArgs.ErrorContext.Handled=true时响应对象为null 因此,我实现了自己的转换器: public class FieldConverter : JsonConverter { public override bool CanConvert(

我在尝试反序列化一些json时遇到了一些问题,因为它与来自服务器的未转义双引号混合在一起。由于我无法在服务器端解决这个问题,所以我尝试忽略有问题的json。为了做到这一点,我遵循了这些答案。当我使用
errorArgs.ErrorContext.Handled=true时响应对象为
null

因此,我实现了自己的转换器:

public class FieldConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return objectType == typeof(FieldOperationDomain);
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            FieldDomain field = new FieldDomain();

            try
            {
                JObject jObject = JObject.Load(reader);

                JToken name = jObject["Name"];

                if (name.Type == JTokenType.String)
                {
                    field.Name = (string)name;
                }
                else
                {
                    field.Name = null;
                }

                JToken value = jObject["Value"];

                if (value.Type == JTokenType.String)
                {
                    field.Value = (string)value;
                }
                else
                {
                    field.Value = null;
                }

                return field;

            } catch (Exception e)
            {
                return new FieldDomain
                {
                    Name = "",
                    Value = ""
                };
            }
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }
    }
我的json如下所示:

[
 {
   "id": "1d5c9ea3-7eb3-4fff-b8da-0a4dec891054",
   "RecordType": 1,
   "Field": []
 },
 {
   "id": "1d5c9ea3-7eb3-4fff-b8da-0a4dec891054",
   "RecordType": 1,
   "Field": [
      {
       "Name": "something",
       "Value": "Other something"
      },
      {
       "Name": "something",
       "Value": "Problematic "Other something""
      }
   ]
 }
]
    public class MainDomain
    {
        [JsonProperty("id")]
        public long RecordType { get; set; }
        
        [JsonProperty("RecordType")]
        public long RecordType { get; set; }
        
        [JsonProperty("Fields")]
        public IEnumerable<Field> Fields { get; set; }
    }
    
    [JsonConverter(typeof(FieldOperationConverter))]
    public class FieldDomain
    {
        [JsonProperty("Name")]
        public string Name { get; set; }
        
        [JsonProperty("Value")]
        public string Value { get; set; }

        [OnError]
        internal void OnError(StreamingContext context, ErrorContext errorContext)
        {
            errorContext.Handled = true;
        }
    }
我的域对象如下所示:

[
 {
   "id": "1d5c9ea3-7eb3-4fff-b8da-0a4dec891054",
   "RecordType": 1,
   "Field": []
 },
 {
   "id": "1d5c9ea3-7eb3-4fff-b8da-0a4dec891054",
   "RecordType": 1,
   "Field": [
      {
       "Name": "something",
       "Value": "Other something"
      },
      {
       "Name": "something",
       "Value": "Problematic "Other something""
      }
   ]
 }
]
    public class MainDomain
    {
        [JsonProperty("id")]
        public long RecordType { get; set; }
        
        [JsonProperty("RecordType")]
        public long RecordType { get; set; }
        
        [JsonProperty("Fields")]
        public IEnumerable<Field> Fields { get; set; }
    }
    
    [JsonConverter(typeof(FieldOperationConverter))]
    public class FieldDomain
    {
        [JsonProperty("Name")]
        public string Name { get; set; }
        
        [JsonProperty("Value")]
        public string Value { get; set; }

        [OnError]
        internal void OnError(StreamingContext context, ErrorContext errorContext)
        {
            errorContext.Handled = true;
        }
    }

问题是,即使使用try-catch块捕捉
JObject-JObject=JObject.Load(reader)上的任何异常
,这不会阻止JsonConvert.DeserializeObject(文档、设置)以避免引发异常。可以执行类似于
errorArgs.ErrorContext.Handled=true的操作
内部
ReadJson
方法?

为什么不删除双引号?Json很大吗

private static string NormalizeJson(string json)
{
    
    var sb = new StringBuilder(json.Length);
    var jsonLength = json.Length;
    for (int i = 0; i < jsonLength; i++)
    {
        var ch = json[i];
        switch (ch)
        {
            case '"':
                // found quot
                sb.Append(ch);
                i++;
                var quIndex = GetEndIndex(json, i);

                var length = quIndex - i;
                 if (length > 0)
                {
                    // replace to white space
                    var buf = json.Substring(i, length)
                        .Replace("\"", " ");
                    sb.Append(buf);
                }

                sb.Append(json[quIndex]);
                i = quIndex;

                break;
            default:
                sb.Append(ch);
                break;
        }
    }

    return sb.ToString();
}

private static int GetEndIndex(string json, int i)
{
    var jsonLength = json.Length;
    var quIndex = i;
    //scan forward, try find end
    var isEnd = false;
    for (int j = i; j < jsonLength; j++)
    {
        var c = json[j];
        switch (c)
        {
            case '"':
                isEnd = !isEnd;
                quIndex = j;
                break;
            case ',':
            case ':':
            case '}':
            case ']':
                if (isEnd)
                    j = jsonLength;
                break;
            default:
                if (isEnd && !Char.IsWhiteSpace(c))
                    isEnd = false;
                break;
        }
    }

    return quIndex;
}
private静态字符串NormalizeJson(字符串json)
{
var sb=新的StringBuilder(json.Length);
var jsonLength=json.Length;
for(int i=0;i0)
{
//替换为空白
var buf=json.Substring(i,长度)
.替换(“\”,”);
某人追加(buf);
}
sb.Append(json[quIndex]);
i=五倍指数;
打破
违约:
某人附加(ch);
打破
}
}
使某人返回字符串();
}
私有静态int GetEndIndex(字符串json,int i)
{
var jsonLength=json.Length;
var-quIndex=i;
//向前扫描,尝试查找结束
var isEnd=假;
对于(int j=i;j
该集合最多可占用5000个寄存器,我担心使用字符串替换无法适用于所有情况。请尝试我添加到答案中的代码,您只能在发现错误时调用此代码。Hi@Stanislav!我尝试了您的解决方案,但未按预期工作。我发现导致问题的原因之一是我的解决方案接收的hat字符串具有转换为ascii的unicode字符,因此我使用了“wait new StreamReader(req.Body,Encoding.UTF8).ReadToEndAsync()“它在某些情况下有效,但并非所有情况下都有效。有些人说我遇到了这个答案。但仍然无法解决忽略json.Hi的特定部分的问题。我知道为什么一些数据被错误地解析,因为我没有排除逗号或其他符号可能在引号之间输入数据的可能性。在新版本中,我修正了这个问题。你的答案有效!另外,我没有提到,但是有一个powershell脚本将这个主体传递给我的方法。所以我添加了这个“$Body | converttoJSON-Depth 100-EscapeHandling EscapeNonAscii”。“EscapeHandling EscapeNonAscii”选项也解决了这个问题。谢谢