2017-02-09 9 views
2

をキー名。私は、などなど_22として数値でキー名を持つJSON出力へのアクセス、_155を持っている私は、これらのキー名のすべてを翻訳するものとのマッピングを作成しましたが、私はjsonを更新する方法を把握しようと苦労しています元のキー名をマップの元のキー名に置き換えます。更新ダイナミックJSONは、私は私の周り私の頭をラップしようとしている、興味深い状況がある

FieldIDは、アンダースコアなしで、ソースにjsonデータに対応:ここで

は、実際のフィールド名が含まれている私のjson文字列の例です。ここ

[ 
{ 
    "FieldID": "7", 
    "FieldName": "Emp ID", 
    "IsSortableInput": "0", 
    "IsFilterableInput": "0", 
    "ViewAlias": "EmpID", 
    "LogicOperator": "IN", 
    "AllowMultipleValues": "1", 
    "IsViewable": "1", 
    "PrimaryOnly": "0", 
    "DisplayOrder": "1" 
}, 
{ 
    "FieldID": "3", 
    "FieldName": "QID", 
    "InputTypeID": "1", 
    "FieldPlaceholder": "Enter Employee Name", 
    "IsSortableInput": "1", 
    "IsFilterableInput": "1", 
    "ViewAlias": "QID", 
    "LogicOperator": "IN", 
    "AllowMultipleValues": "1", 
    "IsViewable": "1", 
    "PrimaryOnly": "0", 
    "DisplayOrder": "2", 
    "FieldTypeDesc": "PeopleSearch" 
}, 
{ 
    "FieldID": "6", 
    "FieldName": "NTID", 
    "IsSortableInput": "1", 
    "IsFilterableInput": "0", 
    "ViewAlias": "NTID", 
    "LogicOperator": "IN", 
    "AllowMultipleValues": "1", 
    "IsViewable": "1", 
    "PrimaryOnly": "0", 
    "DisplayOrder": "3" 
} 

]

私の目標は、マップ(定義されたJSON)でキーの名前を検索し、それらの名前を変更し、ソースjson文字列をループしています。最終的に私の元JSONデータにEmp ID_7を交換します。

出典JSON:私もこのアプローチを開始する場所にはかなり失われています

[ 
{ 
    "QID": "Q123", 
    "Emp ID": "E12345" 
}, 
{ 
    "QID": "X123", 
    "Emp ID": "E34567" 
} 
] 

[ 
{ 
    "_3": "Q123", 
    "_7": "E12345" 
}, 
{ 
    "_3": "X123", 
    "_7": "E34567" 
} 
] 

所望の出力にそれを回す、ソースJSONを変更することです。わからないキー名を名前を変更することができるかどうか、彼らはこれを取り組む上でいくつかの提案を探しているプロセスなど

で削除する必要がある場合。

+0

私は、正しい名前を持つ新しいJSONファイルを作成し直します。 – wvdz

+0

@wvdz - 正しい、それは私がデータの名前を変更して行うことをしようとしていますどのような本質的です。ソースjsonに直接アクセスして名前を変更する必要はありません。フィールドの名前とその名前が対応しています。 – SBB

+0

これを行うには、基本的にカスタムJSONパーサーを作成する必要があります。 JSONファイルがRAMに格納されているなど膨大な理由がある場合を除き、組み込みパーサーを使用してJavaScript配列としてデコードし、それを操作してからもう一度デコードすることをお勧めします。 –

答えて

3

古いキーと新しいキーの参照を構築し、配列やキーを反復処理することができます。その後、新しいプロパティに割り当てて、古いプロパティを削除します。

var keynames = [{ FieldID: 7, FieldName: "Emp ID", IsSortableInput: 0, IsFilterableInput: 0, ViewAlias: "EmpID", LogicOperator: "IN", AllowMultipleValues: 1, IsViewable: 1, PrimaryOnly: 0, DisplayOrder: 1 }, { FieldID: 3, FieldName: "QID", InputTypeID: 1, FieldPlaceholder: "Enter Employee Name", IsSortableInput: 1, IsFilterableInput: 1, ViewAlias: "QID", LogicOperator: "IN", AllowMultipleValues: 1, IsViewable: 1, PrimaryOnly: 0, DisplayOrder: 2, FieldTypeDesc: "PeopleSearch" }, { FieldID: 6, FieldName: "NTID", IsSortableInput: 1, IsFilterableInput: 0, ViewAlias: "NTID", LogicOperator: "IN", AllowMultipleValues: 1, IsViewable: 1, PrimaryOnly: 0, DisplayOrder: 3 }], 
 
    source = [{ _3: "Q123", _7: "E12345" }, { _3: "X123", _7: "E34567" }], 
 
    reference = {}; 
 

 
keynames.forEach(function (o) { 
 
    reference['_' + o.FieldID] = o.FieldName; 
 
}); 
 

 
source.forEach(function (o) { 
 
    Object.keys(o).forEach(function (k) { 
 
     o[reference[k]] = o[k]; 
 
     delete o[k]; 
 
    }); 
 
}); 
 

 
console.log(source);
.as-console-wrapper { max-height: 100% !important; top: 0; }

1

JSONファイルが解析されたら、私が使用します。

削除key.name

その後、目的の値を持つキーを再作成する、このことができます願っています。

1
var source = [ 
     {"_3": "Q123", "_7": "E12345"}, 
     {"_3": "X123","_7": "E34567"} 
    ], 
    translationTable = [ 
     { 
     "FieldID": "7", 
     "FieldName": "Emp ID", 
     "IsSortableInput": "0", 
     "IsFilterableInput": "0", 
     "ViewAlias": "EmpID", 
     "LogicOperator": "IN", 
     "AllowMultipleValues": "1", 
     "IsViewable": "1", 
     "PrimaryOnly": "0", 
     "DisplayOrder": "1" 
     }, 
     { 
     "FieldID": "3", 
     "FieldName": "QID", 
     "InputTypeID": "1", 
     "FieldPlaceholder": "Enter Employee Name", 
     "IsSortableInput": "1", 
     "IsFilterableInput": "1", 
     "ViewAlias": "QID", 
     "LogicOperator": "IN", 
     "AllowMultipleValues": "1", 
     "IsViewable": "1", 
     "PrimaryOnly": "0", 
     "DisplayOrder": "2", 
     "FieldTypeDesc": "PeopleSearch" 
     }, 
     { 
     "FieldID": "6", 
     "FieldName": "NTID", 
     "IsSortableInput": "1", 
     "IsFilterableInput": "0", 
     "ViewAlias": "NTID", 
     "LogicOperator": "IN", 
     "AllowMultipleValues": "1", 
     "IsViewable": "1", 
     "PrimaryOnly": "0", 
     "DisplayOrder": "3" 
     } 
    ], 
    transform = function transform(source, translationTable) { 
     // first we create a lookup table so we can reference each number directly to the key it will become. 
     var nameMap = translationTable.reduce(function(map, next) { 
      var keyName = '_' + next.FieldID; 
      if (!map[keyName]) map[keyName] = next.FieldName; 
      return map; 
     }, {}); 
     // loop over all the source objects, returning a new object with the correct keys. 
     return source.map(function(obj) { 
      return Object.keys(obj).reduce(function(record, keyName) { 
       record[ nameMap[ keyName ] ] = obj[ keyName ]; 
       return record; 
      }, {}); 
     }); 
    }, 
    result = transform(source, translationTable); 
console.log(JSON.stringify(result)); 
0
let mapping = [ 
{ 
    "FieldID": "7", 
    "FieldName": "Emp ID", 
    "IsSortableInput": "0", 
    "IsFilterableInput": "0", 
    "ViewAlias": "EmpID", 
    "LogicOperator": "IN", 
    "AllowMultipleValues": "1", 
    "IsViewable": "1", 
    "PrimaryOnly": "0", 
    "DisplayOrder": "1" 
}, 
{ 
    "FieldID": "3", 
    "FieldName": "QID", 
    "InputTypeID": "1", 
    "FieldPlaceholder": "Enter Employee Name", 
    "IsSortableInput": "1", 
    "IsFilterableInput": "1", 
    "ViewAlias": "QID", 
    "LogicOperator": "IN", 
    "AllowMultipleValues": "1", 
    "IsViewable": "1", 
    "PrimaryOnly": "0", 
    "DisplayOrder": "2", 
    "FieldTypeDesc": "PeopleSearch" 
}, 
{ 
    "FieldID": "6", 
    "FieldName": "NTID", 
    "IsSortableInput": "1", 
    "IsFilterableInput": "0", 
    "ViewAlias": "NTID", 
    "LogicOperator": "IN", 
    "AllowMultipleValues": "1", 
    "IsViewable": "1", 
    "PrimaryOnly": "0", 
    "DisplayOrder": "3" 
} 
]; 

let source = [ 
{ 
    "_3": "Q123", 
    "_7": "E12345" 
}, 
{ 
    "_3": "X123", 
    "_7": "E34567" 
} 
]; 

source.map(ele => { 
    let ret = {}; 
    Object.keys(ele).forEach(key => { 
     let keyNum = key.replace('_',''); 
     let match = mapping.find(ele => { 
      return ele.FieldID === keyNum; 
     }); 
     ret[match.FieldName] = ele[key]; 
    }); 
    return ret; 
}); 
関連する問題