【发布时间】:2021-09-03 14:14:05
【问题描述】:
我有一个带有值作为变量的 json 配置文件。我想用存储在另一个 json 文件中的实际值替换这些变量。
源数据json文件:
{
"person": {
"id": 15305,
"gender": "Male",
"dob": "1958-10-31T00:00:00",
"name": {
"id": 80587,
"first": "John",
"last": "Dominick"
}
},
"ethnicity": [
{
"id": 2,
"display": "Not Hispanic or Latino",
"kbEthnicity": null
}
],
"race": [
{
"id": 4,
"display": "Black"
},
{
"id": 6,
"display": "Other Race"
}
]
}
目的地数据json文件:
{
"dryRun": "true",
"person": {
"firstName": "[person.name.first]",
"lastName": "[person.name.last]",
"dateOfBirth": "[person.dob]",
"gender": "[person.gender]",
"race": "[race]"
}
}
我想要的最终 json 文件: { “dryRun”:“真”, “人”: { "firstName": "约翰", "lastName": "多米尼克", "dateOfBirth": "1958-10-31T00:00:00", “性别”:“男性”, “种族”:“黑人,其他种族” } }
这是我使用以下 SO post 编写的代码,它读取两个文件并能够从源文件中提取正确的值,但我一直坚持创建最终 json 文件的最佳方法是什么.
public static void Main(string[] args)
{
var sourceJson = File.ReadAllText("./sourcedata.json");
var srcObj = JObject.Parse(sourceJson);
var destJson = File.ReadAllText("./destinationdata.json");
var destObj = JObject.Parse(destJson);
var result = destObj.Descendants()
.OfType<JProperty>()
.Select(p => new KeyValuePair<string, object>(p.Path,
p.Value.Type == JTokenType.Array || p.Value.Type == JTokenType.Object
? null : p.Value));
foreach (var kvp in result)
{
var isVariable = kvp.Value == null ? false : Regex.IsMatch(kvp.Value.ToString(), @"^\[.*?\]$");
if (isVariable)
{
var variable = Regex.Replace(kvp.Value.ToString(), @"[\[\]]+", "");
Console.WriteLine($"Key: {kvp.Key} Value: {kvp.Value} Updated: {srcObj.SelectToken(variable)}");
}
else
{
Console.WriteLine($"Key: {kvp.Key} Value: {kvp.Value}");
}
}
}
我要解决的另一个问题是如果存在数组,如何连接这些值?任何帮助将不胜感激。
【问题讨论】:
-
作为一名 C# 用户,我经常在 Web 项目中遇到这类 JSON 处理任务,这些任务通常也是一次性的;即一旦结果 JSON 文件完成,代码也是如此。我个人使用 node.js 来完成这类任务,因为 JS 确实非常适合处理 JSON,而且几乎不需要大惊小怪。虽然有很多变量,例如你知道JS等吗,但无论如何只是一个建议。
-
@LukeBriggs 我同意你的观点,但 JSON 正在成为一种通用格式,所有语言都在更好地配备库来处理它们。我本来会使用 JS,但我现在被困在 C# 来完成这项任务,因为它是我正在尝试更新的现有 Web API 代码的一部分。但是,我听到了。