【问题标题】:Remove illegal character from JSON before deserializing with JSON.NET在使用 JSON.NET 反序列化之前从 JSON 中删除非法字符
【发布时间】:2016-04-16 19:27:59
【问题描述】:

我有一个想要反序列化为数据表的字符串。因为它在值JSON.NET 中有一个双引号,所以无法反序列化它。

[{"name":"soham "the" dasgupta"}]

现在我想用the 替换"the"。请帮忙。 Replace("\"", "") 显然不起作用。

【问题讨论】:

  • 如果你用Replace("\"the\"", "the")或者双引号之间可以是“the”以外的字符串呢?
  • 这是完全错误的 JSON。如果您对代码有任何影响,或者是因为您编写了它,或者您可以联系这种令人难过的事情的生产者,您应该修复或让它修复。任何其他解决方案都会让你发疯。
  • 您的“json”不是有效的 json。如果您需要将“the”替换为上面提到的@croxy
  • 你为什么不使用 RegEX 来做到这一点....并替换两个冒号(:) 符号之间的任何东西是在 " "...
  • @dryman 我无法控制代码。而且我也不知道他们可能在双引号中发送什么字词。

标签: c# json serialization json.net json-deserialization


【解决方案1】:

基本上你需要找到引号之间的字符并检查它们是否是有效的 JSON 分隔符。

我编写了一个快速而肮脏的函数,它搜索字符串之间的子字符串并将它们与有效的 JSON 分隔符匹配。如果子字符串不匹配,它会转义引号。

注意:此代码是我的想法的一个非常基本的示例,它可能无法处理所有类型的 JSON 输入。

static string FixJson(string input)
{
    var output = input;
    for (var x = 0; x < input.Length; x++)
    {
        if (input[x] != '\"') continue;

        for (var y = x + 1; y < input.Length; y++)
        {
            if (input[y] != '\"') continue;

            var found = false;
            for (var z = y + 1; z < input.Length; z++)
            {
                if (input[z] != '\"') continue;

                var tmp = input.Substring(y + 1, z - y - 1);
                if (tmp.Any(t => t != ' ' && t != ':' && t != ',' && t != '{' && t != '}'))
                {
                    output = output.Replace("\"" + tmp + "\"", "\\\"" + tmp + "\\\"");
                }

                x = y;
                found = true;
                break;
            }

            if (found)
                break;
        }
    }

    return output;
}

【讨论】:

  • 根据您的输入返回:[{"name":"soham \"the\" dasgupta"}]
  • 此输出将使用 Newtonsoft.Json.JsonConvert.DeserializeObject 反序列化,请提供您尝试获得的结果?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多