字符串转换为可变的Java

问题描述:

我有我的字符串像字符串转换为可变的Java

5: "White", 6: "Yellow", 7: "Pink" 

我需要这样的

s={5: "White", 6: "Yellow", 7: "Pink"}; 

为它附加该字符串以期形式选择

for (var a in myOpts) 
    { 
     var t = document.createElement("OPTION"); 
     t.value = a; 
     t.appendChild(document.createTextNode(myOpts[a])); 
     selectObj.appendChild(t); 
    } 
+5

你确定你的意思是**的Java **而不是** JavaScript **? – Gabe 2011-03-15 08:16:32

如果你json_decode你的字符串s,你会得到一个拥有3个属性的普通对象。然后你可以在与for..in构建这些属性的循环:

var myOpts, s='{5: "White", 6: "Yellow", 7: "Pink"}'; 
eval('myOpts='+s); // or better, a json parser 
for(var a in myOpts) { 
    if(myOpts.hasOwnProperty(a)) { 
     // your dom code here 
    } 
} 

你的问题有点不清楚,但是 - 我会尝试猜你在说什么,涵盖所有情况,并给予一点点附加值; )

我假定你有一个JSP页面的服务器侧弦,谁的价值是

5: "White", 6: "Yellow", 7: "Pink" 

是什么使得它看起来像

<% 
String data = "5: \"White\", 6: \"Yellow\", 7: \"Pink\""; 
%> 

现在你想写它到文档,所以你可以for它稍后在客户端代码。

从这个意义上说 - 你需要区分少数情况。

尽管当服务器将它写入响应文档时,它是一个字符串 - 客户端代码可以通过不同的方式获取此值。在所有这些服务器中 - 服务器必须以特定的方式写入数据,以便客户端可以访问它,但是,有效性规则是不同的。

写对象文本

其实 - 我认为这是你想要做什么。 客户端代码不会将其作为字符串获取 - 而是作为对象字面值。

<script> 
var sObjData = {<%= safeJs(data) %>}; 
</script> 

这种选择的限制是,无论从服务器代码(<%%>内)来和任何来自标记(所述<%%>外)必须作为一个有效的JavaScript一起工作对象常量。 有很多事情可以打破这个对象文字的合法性 - 就像破碎的字符串,丢失的逗号,缺少冒号等等。虽然这是推荐的方法 - 你必须知道你在做什么,并且我建议你将这些知识分开,你的例子是一个好的开始。

在你的例子中 - 这呈现为一个有效的JavaScript Object-Literal,并且问题不在那里。

<script> 
var sObjData = {5: "White", 6: "Yellow", 7: "Pink"}; 
</script> 

这是一个完全合法的对象字面可以在for使用 - 只要你的方式。

这可能是你的例子是简化你的情况,你使用的字符串可能会破坏你的执行。以下是如何处理来自服务器字符串客户代码:

写JavaString串

在这种情况下的极限 - 是在data字符串的字符可能会破坏JavaSctipt strinbngs - 必须进行转义为javascript

这里我只是看待整个data的值,但请记住,您可能希望对您在此data中放入的每个值都做同样的处理。

这里有一个解释,就是逃避JavaScript的Java字符串最简单的实现:

<%! 
    String safeJs(String data){ 
     return data.replace("\"","\\\"") //why three? two emit a sigle \ and the third escape the " 
        .replace("'","\\'") 
        .replace("\n","\\n") //why two? you're not escaping n, your're emitting \ and n 
        .replace("\r","\\r"); // that will render as escaping for the client code 
    } 
%> 
<script> 
var sObjData = '<%= safeJs(data) %>'; 
<script> 

这部分将确保你从服务器到客户端获取所有数据,而这将是访问客户端。从那里 - 这是你自己的协议,在客户端传递数据并解析它。

但是,并不总是建议这样做:如果您所提供的所有内容都可以制定为对象文字 - 它会更好 - 因为浏览器会在您编写的代码中处理您的解析并给出脚本代码现成的物体。

除非你想解析你自己的字符串协议,看起来 - 它得到了相同的结果以下,所以为什么要麻烦?更好地为safeJs您的价值观。

<script> 
var sObjData = '<%= safeJs(data) %>'; 
var oObjData = eval("{" + oObjData + "}"); 
<script> 

写入字符串到文本区的内容

这是通过服务器和HTML客户端之间串的最可靠的方法 - 因为这可以打破的唯一的事情 - 就是如果数据字符串包含TextArea的结束标记。

文本区域不受换行符的影响,引号是单引号(双引号),它唯一的弱点是它自己的结束标签。

请注意,将“”替换为“< textarea>”和“”替换为“< textarea>”。

为文本区域分配一个ID并将其放入style="display:none"可确保它不会打扰UI,但仍可访问。

<textarea style="display:none" id="txtData"><%=data.replace("</","&lt;/")%></textarea> 
<script> 
    var s = document.getElementById("txtData"); 
</script> 

createElement作品选择

的DHTML窍门建筑选择,但是,我很少使用它,因为它的麻烦,而且性能非常低。 但是 - 如果您设法正确编写了对象文字 - 它应该可以工作。

注入HTML

而不是创造一个选择,并试图填充它 - 它是更快,更可靠,完全把它注射到DOM。

我用下面的工具为:

function getStringBuffer(){ 
    var bfr = []; 
    bfr.add = function() { 
     for(var i=0;i<arguments.length;i++) { 
      this[this.length] = arguments[i]; 
     } 
    } 
    bfr.toString = function() { return this.join("") } 
    return bfr; 
} 

(function(){})()的包裹创建一个匿名函数,并立即执行它 - 即确保不被声明为这项工作的变量将影响全局范围。

第一种方式 - 使用document.write

<script> 
(function(){ 
    var HTML = getStringBuffer(); 
    var k; 

    HTML.add("<select id='selectObj'>"); 
    for (k in myOpts) { 
     HTML.add("<option value='", k, "'>", myOpts[k],"</option>"); 
    } 
    HTML[HTML.length] = "</select>"; 

    document.write(HTML); //note the overriden toString method that will be called here 
})(); 
</script> 

第二种方法 - 使用的innerHTML 你可以做同样的,而是文件撰写 - 使用容器标签来标记选择的地方,有它注入即使在DOM完成加载之后。

是一样的第一种方式,在一个区别:不是document.write(HTML); - 放一个容器,说<span id="oSelectPlace"></span>您要选择是,然后用 document.getElementById("oSelectPlace").innerHTML = HMTL;