Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS:使用类似JSON的结构反序列化字符串_Javascript_String - Fatal编程技术网

Javascript JS:使用类似JSON的结构反序列化字符串

Javascript JS:使用类似JSON的结构反序列化字符串,javascript,string,Javascript,String,我有以下字符串: desc:随机文本字符串,发送者:詹姆斯,se状态:红色,操作:跑步,目标:约翰,ta状态:蓝色,状态应用:红色,知识:知识同侧多洛坐阿梅特 字符串的格式有点像JSON,只是没有所有的括号和换行符以及使它实际有用的东西 此字符串始终具有类别desc、sender、se status、action、target、ta status、status apply和lore。它们总是按那个顺序出现,但可能并不总是存在,并且可以携带任何字符串 问题是,他们可以携带任何字符串,例如,send

我有以下字符串:

desc:随机文本字符串,发送者:詹姆斯,se状态:红色,操作:跑步,目标:约翰,ta状态:蓝色,状态应用:红色,知识:知识同侧多洛坐阿梅特

字符串的格式有点像JSON,只是没有所有的括号和换行符以及使它实际有用的东西

此字符串始终具有类别
desc
sender
se status
action
target
ta status
status apply
lore
。它们总是按那个顺序出现,但可能并不总是存在,并且可以携带任何字符串

问题是,他们可以携带任何字符串,例如,
sender
可以携带字符串“se status:”并混淆东西。但是,这真的不太可能发生,所以它不应该是一个真正的问题

它更可能包含逗号,这对于破坏提取数据的方法非常有用

无论如何


假设我在变量
string
中有上述字符串。我如何使它成为
string.sender
===James,并且对原始字符串中的所有其他类别都是相同的?

棘手的问题,但这里有一种方法可以将该字符串转换为对象:

  • 拆分,'
    以获取对,然后按
    拆分每对:'
    以获取元组数组
  • 映射元组数组以生成对象
  • 将所有这些对象指定给新的空对象

现在,
obj.sender
等于“James”

这里有一种方法:

var str = "desc: random text string, sender: James, se-status: red, action: runs, target: John, ta-status: blue, status-apply: red, lore: lore ipsum dolor sit amet";

var obj = {};
str.split(',').forEach(function(line) {
     var l = line.split(':');   
   obj[l[0].trim()] = (l[1].trim());   
});

console.log(obj);
console.log(JSON.stringify(obj));
作为一项功能:

function myStrToObj(str) {
  var obj = {};
  str.split(',').forEach(function(line) {
     var l = line.split(':');   
     obj[l[0].trim()] = (l[1].trim());   
  });
    return obj;
}
在OP解释后编辑

更好的解析器:

function myStrToObj(str) {
    var lastColon = lastComma = -1;
    var key = value = '';
    var obj = {};
    for(var i = 0; i < str.length; i++) {
        if (str[i] == ':') {
            if (lastColon > 0) {
                value = str.substring(lastColon + 1, lastComma).trim();
                obj[key] = value;
                key = str.substring(lastComma + 1, i).trim();
            } else 
                key = str.substring(0, i).trim();
            lastColon = i;
        };

        if (str[i] == ',') 
             lastComma = i;
    };
    value = str.substring(lastColon + 1, str.length).trim();
    obj[key] = value;        
    return obj;
} 

var str = "desc: random text string, sender: James, se-status: red, problem-field: I'm a problem field, I'm a problem field,  action: runs, target: John, ta-status: blue, status-apply: red, lore: lore ipsum dolor sit amet";
var obj = myStrToObj(str);

console.log(obj);
您可以在没有固定字段的情况下检查字符串。这是一个比我的for循环更好的解决方案


演示:

我想正则表达式应该可以完成这项工作。这是解释

(desc|sender|se-status|action|target|ta-status|status-apply|lore)(?=:):\s?([^:]+)(?=(,\ssender|,\sse-status|,\saction|,\starget|,\sta-status|,\sstatus-apply|,\slore|$))

你可以在下面查看附带的JS代码及其结果

var r=/(描述|发送者| se状态|行动|目标| ta状态|状态应用|知识)(?=:):\s([^:]+)(?=(,\ssender |,\ssestatus |,\saction |,\starget |,\stastatus |,\sstatus apply |,\slore$)/g,
str=“desc:random text string,发送者:詹姆斯,se状态:红色,动作:跑步,目标:约翰,ta状态:蓝色,状态:红色,学识:学识同侧多洛坐阿米特”,
dataObj={},
匹配=[];
while(match[match.length]=r.exec(str));
匹配长度--;
dataObj=match.reduce((p,c)=>(p[c[1]]=c[2],p),{});

write(“+JSON.stringify(dataObj,null,2)+”)
字符串内容可以包含
,还是一个安全的分隔符?为什么不把它变成真正的JSON?此文本来自何处?字符串可以包含任何字符。它是从Google Sheets中获取的,并以这种格式发送给我。假设所有的值都不包含逗号字符,那么这种方式工作得很好。有办法解决这个问题吗?非常感谢您抽出时间。是的,但您必须制作一个更复杂的解析器,逐字符分析字符串,查找:character,然后返回到找到的最后一个逗号来分隔字段。您可以选择将分隔符从逗号改为管道(|)吗?遗憾的是,没有-我正在通过Google Sheets URL访问这些数据。它提供给我的数据实际上是JSON,但我想看的不是。。。这是URL-将其粘贴到美化器中可能会有所帮助。如您所见,我可以更改值本身,但不能更改分隔符。另外,这是原始表-我可以重命名标题,使其长度相等,这可能会使过程更容易。但这已经是一个json响应。。。您只需直接将其加载到对象上。。。与var json=output和you's done:)一样,假设所有字符串都不包含逗号,那么这也可以完美地工作。我想你不会知道如何避免那个错误吧?非常感谢您到目前为止抽出的时间。
var r = /([\w-]+):([\w,\s']+)(?:,|$)/g; 
(desc|sender|se-status|action|target|ta-status|status-apply|lore)(?=:):\s?([^:]+)(?=(,\ssender|,\sse-status|,\saction|,\starget|,\sta-status|,\sstatus-apply|,\slore|$))