static void FixNonStringJson(StringBuilder invalidJson, int endIndex, int nonStringLength) { string newJson = invalidJson.ToString(endIndex, nonStringLength); newJson = JsonFixers.FixNonStringJson(newJson); ReplaceStringPart(invalidJson, endIndex, nonStringLength, newJson); }
/// <summary> /// 1. Escapes double quotes in json property values /// 2. Replaces ":," with ":null," /// </summary> public static string TryFix(string invalidJsonStr) { StringBuilder invalidJson = new(invalidJsonStr); // Unify string start invalidJson = invalidJson.Replace("\": \"", stringStart); int lastStartIndex = notFound, startIndex = invalidJson.IndexOf(stringStart); // Fix non-string Json if (startIndex != notFound) { string newJson = invalidJson.ToString(0, startIndex); newJson = JsonFixers.FixNonStringJson(newJson); ReplaceStringPart(invalidJson, 0, startIndex, newJson); } int endIndex = 0; while (startIndex != notFound) { endIndex = stringEnd .Select(end => invalidJson.IndexOf(end, startIndex + stringStart.Length + 1)) .Where(index => index != notFound) .DefaultIfEmpty(notFound) .Min(); if (endIndex == notFound) { break; } // Fix string int innerStringStart = startIndex + stringStart.Length, innerStringLength = endIndex - innerStringStart; string newString = invalidJson.ToString(innerStringStart, innerStringLength); if (newString.IndexOf('\"') != notFound) { newString = FixJsonString(newString); ReplaceStringPart(invalidJson, innerStringStart, innerStringLength, newString); } lastStartIndex = startIndex; startIndex = invalidJson.IndexOf(stringStart, lastStartIndex + 1); // Fix non-string Json if (startIndex != notFound) { int nonStringLength = startIndex - endIndex; FixNonStringJson(invalidJson, endIndex, nonStringLength); startIndex = invalidJson.IndexOf(stringStart, lastStartIndex + 1); } } if (endIndex < invalidJson.Length) { int nonStringLength = invalidJson.Length - endIndex; FixNonStringJson(invalidJson, endIndex, nonStringLength); } return(invalidJson.ToString());