如何使用javascript将字符串转换为json? (比如A // a1,A // a2,A // a3 // a31 ..)

时间:2017-12-05 11:20:46

标签: javascript json

如何使用javascript或jQuery将字符串转换为JSON?我整天都在想,但我没有好主意。

此任务是在客户端(ASP.Net)动态创建树视图。我的想法是将字符串转换为对象并转换为JSON类型。 (字符串 - >对象 - > JSON)我试过了,但这一天过去了。像A->a3->a31那样构建2个深度是很困难的。

字符串是

var sString = "A//a1,A//a2,A//a3//a31,A//a3//a32,B,C//c1,C//c2";

和JSON格式是



{
  "title": "A",
  "key": "1",
  "folder": true,
  "children": [{
      "title": "a1",
      "key": "2"
    }, {
      "title": "a2",
      "key": "3"
    }, {
      "title": "a3",
      "key": "4",
      "folder": true,
      "children": [{
          "title": "a31",
          "key": "5"
        }...
      }]
  }




(这是fancytreeview插件)

'//'是深度,','是分开的。

请帮帮我..

enter image description here

编辑) 我想把'sString'转换为JSON格式..但是只有JSON类型的字符串。

请理解我的句子很奇怪,因为我的母语不是英语。

EDIT2) 哦..我想将字符串转换为对象,然后将其转换回JSON格式。我没有信心立即将该字符串转换为JSON格式。因为有超过8000个变种。如果可以,请告诉我。

3 个答案:

答案 0 :(得分:4)

我相信这可以在没有递归的情况下完成:



var string = "A//a1,A//a2,A//a3//a31,A//a3//a32,B,C//c1,C//c2";

// Take all the roots
var roots = string.split(',');

// We will attach it to every node and keep it incrementing
var key = 1;

// The final result will be in this object
var result = [];

// Loop through to found roots
roots.forEach(function(root) {
  // Take all the children
  var items = root.split('//');
  var parent = result;

  // Loop through the available children
  items.forEach(function(item, i) {
    // Find if the current item exists in the tree
    var child = getChild(parent, item);

    if (!child) {
    	child = {
        title: item,
        key: key++
      }
      
      // This will ensure that the current node is a folder only
      // if there are more children
      if (i < items.length - 1) {
      	child.folder = true;
        child.children = [];
      }
      
      // Attach this node to parent
      parent.push(child);
    }
    
    parent = child.children;
  });
});

console.log(result);

// Utility function to find a node in a collection of nodes by title
function getChild(parent, title) {
  for (var i = 0; i < parent.length; i++) {
    if (parent[i].title === title) {
      return parent[i];
    }
  }
}
&#13;
&#13;
&#13;

这是我最初想到的草案代码。我相信它可以在复杂性方面进一步改进。

答案 1 :(得分:0)

var key = 1; // keys start at 1

let addPaths = (root, paths) => {

    if (!paths || paths.length == 0)
        return;

    let path = paths.shift();

    //add nodes for the current path
    addNodes(root, path.split('//'));

    // keep going until all paths have been processed
    addPaths(root, paths);
};

let addNodes = (root, nodeList) => {

    if (!nodeList || nodeList.length == 0)
        return;

    let title = nodeList.shift();

    // find node under root with matching title
    let isRootNode = Array.isArray(root);

    node = (isRootNode ? root : root.children || []).find((node) => {
        return node.title == title;
    });


    if (!node){
        node = {
            title: title,
            key: key++
        }

        // are we at root of object?
        if (isRootNode)
            root.push(node);
        else
        {
            if (!root.children)
                root.children = [];

            root.children.push(node);
            root.folder = true;
        }
    }

    addNodes(node, nodeList);
};

let parse = (string) => {
    let object = [];

    let nodes = string.split(',');

    addPaths(object, nodes);

    return object
};

console.log(JSON.stringify(parse("A//a1,A//a2,A//a3//a31,A//a3//a32,B,C//c1,C//c2"), null, 2));

结果是:

[
  {
    "title": "A",
    "key": 1,
    "children": [
      {
        "title": "a1",
        "key": 2
      },
      {
        "title": "a2",
        "key": 3
      },
      {
        "title": "a3",
        "key": 4,
        "children": [
          {
            "title": "a31",
            "key": 5
          },
          {
            "title": "a32",
            "key": 6
          }
        ],
        "folder": true
      }
    ],
    "folder": true
  },
  {
    "title": "B",
    "key": 7
  },
  {
    "title": "C",
    "key": 8,
    "children": [
      {
        "title": "c1",
        "key": 9
      },
      {
        "title": "c2",
        "key": 10
      }
    ],
    "folder": true
  }
]

答案 2 :(得分:0)

尝试以下代码。我使用了关联数组来存储已处理的文件夹,以便更快地查找。

我希望它可以帮到你。

&#13;
&#13;
var sString = "A//a1,A//a2,A//a3//a31,A//a3//a32,B,C//c1,C//c2";

var sArr = sString.split(","); // We will split it by comma so that we can iterate through its items.
var output = []; // Final result will be stored here.
var hash = {}; // It used to keep track of itemObjectect's position for faster lookup.
var counter = 1; // Its value will be used to assign to key;
for(var i = 0; i < sArr.length; i++){
		  var items = sArr[i].split("//"); 
		  var itemObject = {}; // Object to store value of each item.
		  var parentItemObject = {}; // It will refer to current parentObject during iteration.
		  for(var j = 0; j < items.length; j++){
			// Check if item is already processed and stored in hash map.
			if(hash.hasOwnProperty(items[j])){
			  // Check if parent Object value is empty then we will fetch it from hash directly.
			  if(isEmpty(parentItemObject)){
				parentItemObject = output[hash[items[j]]];
			  }
			  else{
				// It is parent element but is child of another element. Then we will fetch it from it's children array.
				if(typeof parentItemObject.children !== "undefined"){
				  parentItemObject = parentItemObject.children[hash[items[j]]];
				}
			  }
			  continue;
			}  
			
				itemObject.title = items[j];
				itemObject.key = counter++;
			  
			  // Check if it is a folder item.
			  if(j != items.length -1){
				itemObject.folder = true;
				itemObject.children = [];
				if(isEmpty(parentItemObject)){
					parentItemObject = itemObject;
					hash[itemObject.title] = output.length;
					output.push(itemObject);
				}
				else{
					if(typeof parentItemObject.children !== "undefined"){
					  hash[itemObject.title] = parentItemObject.children.length;
					  parentItemObject.children.push(itemObject);
					}
					parentItemObject = itemObject;
				}
			  }
			  else{
				
				if(isEmpty(parentItemObject)){
					parentItemObject = itemObject;
					hash[itemObject.title] = output.length;
					output.push(itemObject);
				}
				if(typeof parentItemObject.children !== "undefined"){
				  hash[itemObject.title] = parentItemObject.children.length;
				  parentItemObject.children.push(itemObject);
				}
			  }
			
			itemObject = {};
		  }
		  
		  //console.log(items);
		}

function isEmpty(itemObject) {
  return Object.keys(itemObject).length === 0;
}

//console.log(hash);
console.log(JSON.stringify(output,null,2));
&#13;
&#13;
&#13;