fix(json): remove invalid plus signs before parsing config

This commit is contained in:
Pedram Karimi 2026-05-20 04:19:09 +03:30
parent 0f3fc8e053
commit 9a3ff2dbcf

View file

@ -93,7 +93,8 @@ public class JsonUtils
{ {
return null; return null;
} }
return JsonNode.Parse(strJson, nodeOptions: null, _defaultDocumentOptions);
return JsonNode.Parse(NormalizeBrokenJson(strJson), nodeOptions: null, _defaultDocumentOptions);
} }
catch catch
{ {
@ -167,4 +168,74 @@ public class JsonUtils
{ {
return JsonSerializer.SerializeToNode(obj, options); return JsonSerializer.SerializeToNode(obj, options);
} }
/// <summary>
/// Normalizes a broken JSON-like string by removing plus signs (+)
/// that are located outside quoted string values.
/// </summary>
/// <param name="json">
/// The JSON-like input string that may contain invalid plus signs.
/// </param>
/// <returns>
/// A normalized JSON string that can be parsed by <see cref="JsonNode.Parse(string?, JsonNodeOptions?, JsonDocumentOptions)"/>.
/// </returns>
/// <remarks>
/// This method is designed for cases where the input looks similar to JSON
/// but contains invalid plus signs, such as:
///
/// <code>
/// {"scMaxEachPostBytes":+1000000,+"scMaxConcurrentPosts":+100,+"xPaddingBytes":+"100-1000"}
/// </code>
///
/// The method removes only plus signs that are outside string values.
///
/// It does not remove plus signs inside quoted strings:
///
/// <code>
/// {"phone":"+49123456789"}
/// </code>
///
/// This behavior prevents accidental modification of valid string data.
/// </remarks>
private static string NormalizeBrokenJson(string json)
{
var result = new StringBuilder(json.Length);
bool insideString = false;
bool escaped = false;
foreach (char ch in json)
{
if (escaped)
{
result.Append(ch);
escaped = false;
continue;
}
if (ch == '\\' && insideString)
{
result.Append(ch);
escaped = true;
continue;
}
if (ch == '"')
{
insideString = !insideString;
result.Append(ch);
continue;
}
// Remove plus signs only when they are outside string values.
if (!insideString && ch == '+')
{
continue;
}
result.Append(ch);
}
return result.ToString();
}
} }