解析动态 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"
值的示例:
- { "x":123 }
- { "x":123, "y":420 }
- { }
- { "z":69 }
- { "abc": 777 }
我想知道什么是从 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>()
// ...
}
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.
想象一个接受 2 个字符串参数的方法:
public int Method(string expression, string variables) { ... }
"expression"
预计是数学题。需要评估的表达式(例如“1 + 2”)。如果除了数字和运算符之外还有其他内容,我需要在 "variables"
字符串参数中查找 variable
,以用它代表的数字替换该变量。 (不能保证变量在 "variables"
中定义,但我相信它在这里并不重要)。
输入示例:
Method("351 + x", "{ \"x\":69 }");
// Expected output: 420
其他有效 "variables"
值的示例:
- { "x":123 }
- { "x":123, "y":420 }
- { }
- { "z":69 }
- { "abc": 777 }
我想知道什么是从 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>()
// ...
}
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.