У меня есть следующие данные как JSON в одной переменной, которую я строю в одном контроллере. Я могу получить доступ к этим данным json в другом контроллере с использованием фабрики/службы. Теперь я хочу изменить данные json как выходные данные json.
Вход Json
[
{
"text":"Identity",
"checked":true,
"timestamp":1435862483093
},
{
"text":"Calendar",
"checked":true,
"timestamp":1435862483443
},
]
Вывод:
{
"myname":{
"Facebook":{
"trackdata":[
{
"text":"Identity",
"checked":true,
"timestamp":1435862483093
},
{
"text":"Calendar",
"checked":true,
"timestamp":1435862483443
}
],
"selecteddata":[
{
"text":"Identity",
"checked":true,
"timestamp":1435862483093
},
{
"text":"Calendar",
"checked":true,
"timestamp":1435862483443
}
]
}
}
}
Что я пытаюсь:
var trackdata = JSON.stringify(DataService.getTrackedData());
var selecteddata = JSON.stringify(DataService.getSelectedData());
var userJson = {};
userJson["trackdata"] = trackdata;
userJson["selecteddata"] = selecteddata;
userJson["Facebook"] = ???
userJson["myname"] = ???
Что я могу написать в последних строках. Причина, по которой я нахожусь, - это в будущем "myname" и "Facebook" будет соответствовать пользователю.
Обновление: 2
pmApp.controller('FooterController', function ($scope, $state, DataService) {
$scope.infunc = function () {
console.log("Username : " + DataService.username);
console.log("Application Name : " + DataService.applicationName);
var username = DataService.username;
var applicationName = DataService.username;
$scope.outputJson = {
username: {
applicationName: {
"trackdata": DataService.getTrackedData(),
"selecteddata": DataService.getSelectedData()
}
}
}
/* $scope.outputJson.myname.Facebook.trackdata = ;
$scope.outputJson.myname.Facebook.selecteddata = DataService.getSelectedData();*/
console.log(JSON.stringify($scope.outputJson));
};
});
Это дает мне вывод следующим образом:
"username":{
"applicationName":{
"trackdata":[
Вместо имени пользователя и имени приложения оно должно печатать фактическое значение этой переменной. Не могли бы вы рассказать мне, что я делаю неправильно здесь.
Заранее спасибо.
Любая помощь будет оценена по достоинству.
Хорошо, здесь что-то простое, что я придумал:
// parse input in order to modify it
var inputObj = JSON.parse(input);
// create a new object based on your data from your input
var outputObj = {
'myname': {
'Facebook': {
'trackdata': inputObj,
'selecteddata': inputObj
}
}
};
// create new JSON output
var output = JSON.stringify(outputObj);
var input = '[ { "text":"Identity", "checked":true, "timestamp":1435862483093 }, { "text":"Calendar", "checked":true, "timestamp":1435862483443 }]';
var inputObj = JSON.parse(input);
var outputObj = {
'myname': {
'Facebook': {
'trackdata': inputObj,
'selecteddata': inputObj
}
}
};
var output = JSON.stringify(outputObj);
$('#input').html(JSON.stringify(inputObj,null,2));
$('#output').html(JSON.stringify(outputObj,null,2));
<script src="/jquery.min.js"></script>
Input: <pre id="input"></pre><br>
Output: <pre id="output"></pre>
РЕДАКТИРОВАТЬ:
Я думаю, что это путаница в отношении того, что JSON.parse()
и JSON.stringify()
. JSON.parse()
принимает строку json в качестве входных данных и выводит объект javascript. JSON.stringify()
принимает в качестве входного объекта javascript и выводит строку. В том, что вы пытались, вы назначаете строку в поле объекта javascript, когда вам, вероятно, захочется назначить объект в поле вместо этого. Это помогает?
РЕДАКТИРОВАТЬ:
Чтобы закончить свой пример, указанный в вопросе, выполните следующие действия.
var trackdata = JSON.stringify(DataService.getTrackedData());
var selecteddata = JSON.stringify(DataService.getSelectedData());
var fieldName1 = "Facebook";
var fieldName2 = "myname";
var userJson = {};
userJson["trackdata"] = trackdata;
userJson["selecteddata"] = selecteddata;
var userJson2 = {};
userJson2[fieldName1] = userJson;
var userJson3 = {};
userJson3[fieldName2] = userJson2;
Примечание. Я бы не рекомендовал делать это таким образом, поскольку он использует больше переменных, запутывает и нелегко поддерживать. Построение объекта от root к детям намного проще, чем наоборот, что и пытался сделать ваш шаблон кода.
Вот мой пример кода:
$scope.inputJson = [
{
"text":"Identity",
"checked":true,
"timestamp":1435862483093
},
{
"text":"Calendar",
"checked":true,
"timestamp":1435862483443
}
]
$scope.outputJson = {
"myname": {
"Facebook":{
"trackdata": [],
"selecteddata": []
}
}
}
$scope.outputJson.myname.Facebook.trackdata = $scope.inputJson;
$scope.outputJson.myname.Facebook.selecteddata = $scope.inputJson;
inputObj
в моем коде наDataService.getTrackedData()