解析动态 JSON 数据的最佳方式是什么

What's the best way to parse dynamic JSON data

想象一个接受 2 个字符串参数的方法:

public int Method(string expression, string variables) { ... }

"expression" 预计是数学题。需要评估的表达式(例如“1 + 2”)。如果除了数字和运算符之外还有其他内容,我需要在 "variables" 字符串参数中查找 variable ,以用它代表的数字替换该变量。 (不能保证变量在 "variables" 中定义,但我相信它在这里并不重要)。

输入示例:

Method("351 + x", "{ \"x\":69 }");
// Expected output: 420

其他有效 "variables" 值的示例:

我想知道什么是从 JSON 中解析和检索数据的好方法(每次可能有不同的结构(即不同数量的属性和名称)),映射它与 "expression" 字符串中的 variable?

就我个人而言,我会选择 Newtonsoft.Json 并使用到 Dictionary<string, object>:

的映射
using Newtonsoft.Json;

public int Method(string expression, string variables) 
{ 
    var varsDic = 
        JsonHelper.IsValidJson(variables)
            ? JsonConvert.DeserializeObject<Dictionary<string, object>>(variables);
            : new Dictionary<string, object>()

    // ...
}

Example, documentation.

IsValidJson 是这样的:

public static class JsonHelper
{
    public static bool IsValidJson(string json)
    {
        return IsValidJson(json, out _);
    }

    public static bool IsValidJson(string json, out Exception parseError)
    {
        if (string.IsNullOrWhiteSpace(json))
        {
            parseError = new Exception(Resources.JsonEmpty);
            return false;
        }

        json = json.Trim();
        if (json.StartsWith(@"{") && json.EndsWith(@"}") || //For object
            json.StartsWith(@"[") && json.EndsWith(@"]")) //For array
        {
            try
            {
                JToken.Parse(json);

                parseError = null;
                return true;
            }
            catch (JsonReaderException x)
            {
                parseError = x;
                return false;
            }
            catch (Exception x)
            {
                parseError = x;
                return false;
            }
        }
        else
        {
            parseError = new Exception(Resources.JsonNoStartEnd);
            return false;
        }
    }

See also.