c# - C# 是否存在无效(脏)JSON 解析器?
问题描述
我有一个我无法控制的 JSON,需要定期检索它。80% 的时间它是有效的 JSON,但并非总是如此。
主要问题是:
- 引号内的值(例如
{ "key": "some "invalid" value" }
) - 未关闭的对象和数组(例如
{ "key": [ "value" }
) - 空值,而不是
null
(例如{ "key": }
)。
我编写了一个函数来修复引号和空值,但非封闭对象让我发疯。
/// <summary>
/// 1. Escapes double quotes in json property values
/// 2. Replaces ":," with ":null,"
/// </summary>
public static string TryToFixJson(string invalidJsonStr)
{
var invalidJson = new StringBuilder(invalidJsonStr);
string[] stringStart =
{
"\":\"",
"\": \""
};
string[] stringEnd =
{
"\",",
"\"}",
"\"]",
"\",\""
};
foreach (string start in stringStart)
{
int lastStartIndex = -1,
startIndex = invalidJson.IndexOf(start);
// Fix non-string Json
if (startIndex > -1)
{
string newJson = invalidJson.ToString(0, startIndex);
newJson = FixNonStringJson(newJson);
ReplaceStringPart(invalidJson, 0, startIndex, newJson);
}
while (startIndex != -1)
{
int endIndex = stringEnd
.Select(end => invalidJson.IndexOf(end, startIndex + start.Length + 1))
.Where(index => index != -1)
.DefaultIfEmpty(-1)
.Min();
if (endIndex == -1)
{
break;
}
// Fix string
int innerStringStart = startIndex + start.Length, innerStringLength = endIndex - innerStringStart;
string newString = invalidJson.ToString(innerStringStart, innerStringLength);
if (newString.IndexOf('\"') != -1)
{
newString = FixJsonString(newString);
ReplaceStringPart(invalidJson, innerStringStart, innerStringLength, newString);
}
lastStartIndex = startIndex;
startIndex = invalidJson.IndexOf(start, lastStartIndex + 1);
// Fix non-string Json
if (startIndex > -1)
{
int nonStringLength = startIndex - endIndex;
string newJson = invalidJson.ToString(endIndex, nonStringLength);
newJson = FixNonStringJson(newJson);
ReplaceStringPart(invalidJson, endIndex, nonStringLength, newJson);
startIndex = invalidJson.IndexOf(start, lastStartIndex + 1);
}
}
}
return invalidJson.ToString();
}
private static void ReplaceStringPart(StringBuilder stringToModify, int partStart, int partLength, string newString)
{
stringToModify.Remove(partStart, partLength);
stringToModify.Insert(partStart, newString);
}
private static string FixNonStringJson(string newJson)
{
// Remove non-essential data
string[] nonEssentialCharacters =
{
"\r",
"\n",
" ",
"\t"
};
newJson = nonEssentialCharacters.Aggregate(newJson, (res, ch) => res.Replace(ch, ""));
// Add null values instead of empty ones
string[] noValue =
{
":,",
":]",
":}"
};
newJson = noValue.Aggregate(newJson, (res, nv) => res.Replace(nv, nv.Insert(1, "null")));
return newJson;
}
private static string FixJsonString(string newString)
{
newString = newString.Replace("\"", "\\\"");
return newString;
}
C# 是否有一些无效的 JSON 解析器。我为 JS 找到了一个。它修复了除空值之外的所有内容,但我已经可以处理了。
编辑:更多信息来回答评论。
- 每次出现问题时,我都会联系生成 JSON 的人,他们会在一三天内修复它,但这个过程非常耗时,需要持续关注。
- 我真的不知道他们是如何获得这个 JSON 的,但在这一点上,它似乎是附加了一些直接构建 JSON 字符串的字符串生成的。这个系统已经很老了,他们不会做任何事情来制作一个合适的 JSON 生成器。
- 关于在 JS 上使用修复程序。此代码需要在 Xamarin Forms 应用程序中运行,我认为启动单独的节点服务器只是为了淡化一些 JSON 将是这里的答案。
解决方案
推荐阅读
- php - 此集合中不存在属性 [x] - laravel
- java - java.text.ParseException:使用 Clock.systemUTC() 时出现无法解析的日期错误
- python - Django REST framework 一对多关系和数据库查询
- javascript - 使用变量作为对象键的值 - 在 React-native 中
- google-sheets - SUMPRODUCT 使用多个条件计算多列中的多个单元格
- arrays - Scala中的函数式编程:在多维列表中查找元素的索引
- c# - 当您不关心结果时不使用等待
- jsf - 组件 id form1:j_id28 已在视图中找到
- python - Pandas 将列值连接为列之间的列表,然后将整个数据帧转储到 numpy 数组中
- opencv - OpenCV Brisk 未检测到任何关键点