如何使用 node.js 更新动态 JSON 文件的属性值
How to update the attribute value for dynamic JSON file using node.js
我正在检查 input.json 文件键是否与 server.json 文件匹配,然后更新 server.json 文件的值。问题是 server.json 文件是动态的 json 文件,结构无法预测,它包含 100 个嵌套数组和复杂格式的元素。我只想检查 input.json 密钥在 server.json(动态内容)文件
中的任何位置是否可用
我有以下 json 个具有某些属性和值的输入文件:
input.json:
{"country":"GB","currency":"GBP"}
示例server.json(动态内容不可预测):
{
"bank": [
{
"country":"US",
"currency":"USD"
}
]
}
输出:
{
"bank": [
{
"country":"GB",
"currency":"GBP",
}
]
}
如果密钥匹配,我只想从 input.json 文件更新上面的 server.json 文件值。并且(Input.json 和 server.json )文件应该有相同的键(国家,货币)。但问题是 server.json 中键的索引是未知的,它将是动态内容.
用户可以提供 server.json 中可用的任何输入,并根据需要更新的键匹配。
试过以下示例:
async function generateRequestBody(actual, index, functionRef) {
let callback;
let payload;
_globaldeclartion = actual;
Object.keys(dataset[index]).forEach(function (queueId) {
if (queueId == functionRef) {
payload = dataset[index][queueId];
return;
}
});
payload = await jsonValidator(payload);
await updateJsonFile(_globaldeclartion, async (data) => {
Object.keys(data).forEach(async (T) => {
console.log(T);
data[T] = payload[T];
});
callback = data;
return data;
});
return callback;
如果 input.json 文件键与 server.json(不可预测的 json 结构)文件匹配,我只想更新 server.json。
更新:
有时 server.js 文件将遵循以下结构:
{
"country":"GB",
"currency":"GBP",
}
有时它可能有更多的嵌套数组。
{
"bank":[
{
"property":[
{
"country":"GB",
"currency":"GBP"
}
],
}
]
}
和 server.json 结构是不可预测的,我们只需要检查 input.json 键在 server.json 中是否可用,并且需要更改这些值而不考虑结构。
已更新 - 最新:
async function getIdea(input, data)
{
var datastring = JSON.stringify(data);
Object.entries(input).forEach(([key, value]) => {
console.log(key);
console.log(value);
var re = new RegExp(`"${key}":"[^"]*"`, "g");
console.log(re);
dataString = datastring.replace(re, `"${key}":"${value}"`);
});
console.log(JSON.parse(datastring))
}
getIdea(输入,数据);
Input.json
{
"country":"GB",
"currency":"GBP"
}
data.json
{
"bank": [
{
"country":"US",
"currency":"USD",
}
]
}
输出控制台:
country
GB
/"country":"[^"]*"/g
currency
GBP
/"currency":"[^"]*"/g
{
bank: [
{
country: 'US',
currency: 'USD',
}
]
}
有很多方法可以做到这一点。
您可以简单地将需要修改的对象字符串化并遍历输入对象的条目,使用正则表达式替换所需的内容。
var updateProps = function(data, input) {
var dataString = JSON.stringify(data);
// Iterate over all entries in input object
Object.entries(input).forEach(([key, value]) => {
// matches property value string pair you are looking for
// eg.: "country": "US"
var re = new RegExp(`"${key}":"[^"]*"`, "g");
// replace what with new pair
dataString = dataString.replace(re, `"${key}":"${value}"`)
});
return JSON.parse(dataString)
}
现在您只需在需要的对象上调用函数即可:
var input = {
"country": "GB",
"currency": "GBP"
}
var server1 = {
"bank": [{
"bankAccountType": "Saving",
"country": "US",
"currency": "USD",
"firstName": "TestFirstName",
"lastName": "TestLastName",
"confirmed": "true"
}]
}
var server2 = {
"bankAccountType": "Saving",
"country": "GB",
"currency": "GBP",
"firstName": "TestFirstName",
"lastName": "TestLastName",
"confirmed": "true"
}
console.log("Changed object 1: ", fn(server1, input))
console.log("Changed object 2: ", fn(server2, input))
/*
{...,"country":"US","currency":"USD",...}
chagnes to:
{...,"country":"GB","currency":"GBP",...}
*/
我正在检查 input.json 文件键是否与 server.json 文件匹配,然后更新 server.json 文件的值。问题是 server.json 文件是动态的 json 文件,结构无法预测,它包含 100 个嵌套数组和复杂格式的元素。我只想检查 input.json 密钥在 server.json(动态内容)文件
中的任何位置是否可用我有以下 json 个具有某些属性和值的输入文件:
input.json:
{"country":"GB","currency":"GBP"}
示例server.json(动态内容不可预测):
{
"bank": [
{
"country":"US",
"currency":"USD"
}
]
}
输出:
{
"bank": [
{
"country":"GB",
"currency":"GBP",
}
]
}
如果密钥匹配,我只想从 input.json 文件更新上面的 server.json 文件值。并且(Input.json 和 server.json )文件应该有相同的键(国家,货币)。但问题是 server.json 中键的索引是未知的,它将是动态内容.
用户可以提供 server.json 中可用的任何输入,并根据需要更新的键匹配。
试过以下示例:
async function generateRequestBody(actual, index, functionRef) {
let callback;
let payload;
_globaldeclartion = actual;
Object.keys(dataset[index]).forEach(function (queueId) {
if (queueId == functionRef) {
payload = dataset[index][queueId];
return;
}
});
payload = await jsonValidator(payload);
await updateJsonFile(_globaldeclartion, async (data) => {
Object.keys(data).forEach(async (T) => {
console.log(T);
data[T] = payload[T];
});
callback = data;
return data;
});
return callback;
如果 input.json 文件键与 server.json(不可预测的 json 结构)文件匹配,我只想更新 server.json。
更新:
有时 server.js 文件将遵循以下结构:
{
"country":"GB",
"currency":"GBP",
}
有时它可能有更多的嵌套数组。
{
"bank":[
{
"property":[
{
"country":"GB",
"currency":"GBP"
}
],
}
]
}
和 server.json 结构是不可预测的,我们只需要检查 input.json 键在 server.json 中是否可用,并且需要更改这些值而不考虑结构。
已更新 - 最新:
async function getIdea(input, data)
{
var datastring = JSON.stringify(data);
Object.entries(input).forEach(([key, value]) => {
console.log(key);
console.log(value);
var re = new RegExp(`"${key}":"[^"]*"`, "g");
console.log(re);
dataString = datastring.replace(re, `"${key}":"${value}"`);
});
console.log(JSON.parse(datastring))
}
getIdea(输入,数据);
Input.json
{
"country":"GB",
"currency":"GBP"
}
data.json
{
"bank": [
{
"country":"US",
"currency":"USD",
}
]
}
输出控制台:
country
GB
/"country":"[^"]*"/g
currency
GBP
/"currency":"[^"]*"/g
{
bank: [
{
country: 'US',
currency: 'USD',
}
]
}
有很多方法可以做到这一点。
您可以简单地将需要修改的对象字符串化并遍历输入对象的条目,使用正则表达式替换所需的内容。
var updateProps = function(data, input) {
var dataString = JSON.stringify(data);
// Iterate over all entries in input object
Object.entries(input).forEach(([key, value]) => {
// matches property value string pair you are looking for
// eg.: "country": "US"
var re = new RegExp(`"${key}":"[^"]*"`, "g");
// replace what with new pair
dataString = dataString.replace(re, `"${key}":"${value}"`)
});
return JSON.parse(dataString)
}
现在您只需在需要的对象上调用函数即可:
var input = {
"country": "GB",
"currency": "GBP"
}
var server1 = {
"bank": [{
"bankAccountType": "Saving",
"country": "US",
"currency": "USD",
"firstName": "TestFirstName",
"lastName": "TestLastName",
"confirmed": "true"
}]
}
var server2 = {
"bankAccountType": "Saving",
"country": "GB",
"currency": "GBP",
"firstName": "TestFirstName",
"lastName": "TestLastName",
"confirmed": "true"
}
console.log("Changed object 1: ", fn(server1, input))
console.log("Changed object 2: ", fn(server2, input))
/*
{...,"country":"US","currency":"USD",...}
chagnes to:
{...,"country":"GB","currency":"GBP",...}
*/