将数据从一个 json 对象动态添加到另一个

Posted

技术标签:

【中文标题】将数据从一个 json 对象动态添加到另一个【英文标题】:Adding data dynamically from one json object to another 【发布时间】:2012-06-20 04:10:21 【问题描述】:

假设我有一个 json 对象朋友为:


   title: Friends
   link: /friends.json
   description: "My friends"
   people: [
   
   id: "1",
   name: "Matthew",
   img: "img/matthew.jpg"
   ,
   
   id: "2",
   name:"Matt",
   img: "img/matt.jpg"
   ,
   
   id: "3",
   name: "David",
   img: "img/dav.jpg"
   
   ]

这被存储为文件friends.json

现在使用 javascript/jQuery,我需要创建一个新对象 good_friends.json 并需要使用“people.id”从 friends.json 的“people”字段向其添加值(动态和一对一) ”。我该怎么做?

【问题讨论】:

JSON 在几个方面是无效的。键需要用双引号括起来,所有其他字符串(例如Friends/friends.json)也是如此。请参阅json.org 和 jsonlint.com。 使用 JSON.parse 从您的 JSON 字符串中简单地创建 javascript 对象,并对您的对象进行基本的 javascript 操作。 我对 jQuery 和 json 还很陌生,所以对它们了解不多。我似乎想不出为什么我发布了这个问题。这可能有点愚蠢,但任何帮助将不胜感激。 【参考方案1】:

如果您想保存更改,您几乎需要一个服务器端进程。

您可以通过ajax 加载 JSON:

$.ajax(
    url: "/path/to/friends.json",
    dataType: "json",
    success: function(data) 
        // Here, `data` will be the object resulting from deserializing the JSON
        // Store `data` somewhere useful, perhaps you might have a `friends`
        // variable declared somewhere; if so:
        friends = data;
    ,
    error: function() 
       // Handle the error
    
);

要添加到反序列化的对象,你只需在内存中修改它:

friends.people.push(
    id: String(friends.people.length + 1),
    name: "John",
    img: "img/john.jpg"
);

当然,这些值可能来自输入字段或其他内容,例如:

function addPerson() 
    friends.people.push(
        id: String(friends.people.length + 1),
        name: $("#nameField").val(),
        img: $("#imgField").val()
    );

现在您有了数据的内存副本。要将其存储到某个地方,您必须有一个可以将其发布到的服务器端进程。您可能会在发布之前对其进行序列化,例如,通过JSON.stringify 或类似方式。如果您的浏览器本身没有JSON.stringify(大多数现代浏览器有,有些旧浏览器没有),您可以使用Crockford's。

或者,如果这只是供您自己使用,您可以在文本字段中显示字符串化结果,然后使用复制粘贴将其粘贴到文本编辑器中的friends.json

这是一个完整的示例,它在文本区域中显示 JSON:Live copy | source

<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>Test Page</title>
<style>
  body 
    font-family: sans-serif;
  
</style>
</head>
<body>
  <label>Name:
    <input type="text" id="nameField">
  </label>
  <br><label>Img:
    <input type="text" id="imgField">
  </label>
  <br><input type="button" id="btnAdd" value="Add" disabled>
  <input type="button" id="btnShow" value="Show JSON" disabled>
  <br><div id="msg">&nbsp;</div>
  <hr>
  <textarea id="showField" rows="10" cols="60"></textarea>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script>
// Note that all of our script tags are at the end of the
// document. This lets the page load as quickly as possible
// and means we don't have to worry about whether the elements
// have been created yet (they have, because the scripts are
// below them).

// Put all of our code inside a function so we don't
// create globals
(function($) 
    if (typeof JSON === "undefined") 
        // Load Crockford's json2.js
        // NOTE: You'd want to use your own copy, not a hotlink
        // to his github like this.
        var scr = document.createElement('script');
        scr.src = "https://raw.github.com/douglascrockford/JSON-js/master/json2.js";
        document.documentElement.appendChild(scr);
    

    var friends; // Where our deserialized friends.json will go

    // Focus the first field
    $("#nameField").focus();

    // Load the JSON
    $.ajax(
        url: "http://jsbin.com/ojexuz",
        dataType: "json",
        success: function(data) 
            // Here, `data` will be the object resulting from deserializing the JSON
            // Store `data` somewhere useful, perhaps you might have a `friends`
            // variable declared somewhere; if so:
            friends = data;

            // Enable our buttons now that we have data
            $("input[type='button']").prop("disabled", "");
        ,
        error: function() 
            // Handle the error
            alert("Error loading friends.json");
        
    );

    // Handle clicks on the "Add" button
    $("#btnAdd").click(function() 
        var nameField = $("#nameField"),
            imgField  = $("#imgField"),
            name      = $.trim(nameField.val()),
            img       = $.trim(imgField.val());
        if (!name || !img) 
            alert("Please supply both name and image");
            return;
        
        addPerson(name, img);
        $("#msg").text("Added '" + name + "'");
        nameField.focus();
    );

    // An "add this person" function
    function addPerson(name, img) 
        friends.people.push(
            id:   String(friends.people.length + 1),
            name: name,
            img:  img
        );
    

    // Handle clicks on the "Show" button
    $("#btnShow").click(function() 
        $("#showField").val(JSON.stringify(friends));
    );

)(jQuery);
</script>
</body>
</html>

【讨论】:

做得很好,实时副本和代码对于任何查找 JSON/Ajax 示例的初学者都非常有用。 谢谢!这是很多有价值的信息......但是,我需要创建一个新的 json 对象并为其添加值。我该怎么做? @VJ41:您可能不是指“JSON 对象”。您可能只是指“对象”。 (JSON 是一种用于交换数据的文本符号;一旦您与代码中的数据进行交互,您就不再使用 JSON,而只是使用对象。)要创建对象,您可以使用 object initializer、、可选地在其中包含属性。我在addPerson 中使用了上面的一个。例如,var o = foo: "bar"; 创建一个具有一个属性foo 的对象,其值为"bar",并将该对象分配给变量o 我需要将新数据发送到服务器进行进一步处理。我需要 json 对象吗? @VJ41:通常您以名称/值对的形式向服务器发送数据。对于复杂的结构化数据,发送一个名称/值对,其中值是一个序列化为 JSON 的对象图,是一种很好的方法。

以上是关于将数据从一个 json 对象动态添加到另一个的主要内容,如果未能解决你的问题,请参考以下文章

Extjs 7,如何使用视图模型将动态数据从一个控制器传递到另一个控制器

从android中的其他类动态地将对象添加到listview

如何将动态创建的 qmlcomponent 对象绑定到另一个动态创建的 qmlcomponent 对象的属性?

使用javascript添加基于json值的动态div标签

PLSQL:将数据从一个表中插入可能的环境到另一个表,同时保持 from_table 名称动态

如何使用 JQuery 或 Javascript 使用动态路径从 JSON 对象中删除