【问题标题】:Ajax response from webservice --Parsing in Javascript来自 web 服务的 Ajax 响应——在 Javascript 中解析
【发布时间】:2014-01-13 12:55:46
【问题描述】:

请告诉我如何解析这个来自网络服务的字符串作为地图。

当我在我的 javascript 中使用警报时,我得到的响应为

{1=xxx,2=eee,3=ddd,4=rrr,D=3,R=ttt}

我想获取D 键之前的值..

作为{"1":"xxx","2":"eee","3":"ddd","4":"rrr"}

在此处输入代码

还有D 值的警报3

还有R 值的警报ttt

提前致谢

【问题讨论】:

  • 你是如何从服务器发送的?
  • 将 TreeMap 转换为字符串并从服务器返回。我必须将这些值设置为选择下拉框
  • 使用 Axis 2 web 服务

标签: javascript


【解决方案1】:

您所拥有的几乎是有效的 JSON(JavaScript 对象表示法),但不完全是。

例如,JSON 要求属性名称用双引号引起来。要对 TreeMap 进行 JSON 字符串化,您可以尝试从这里开始:How to serialize a Map of a Map with GSON?

或者,如果您无法让 GSON 正常工作,您也可以使用自己的 JSON 字符串化:双引号属性名称,双引号字符串值,确保正确转义字符串值中的特殊字符(反斜杠变为 \\,换行符\n,双引号变成\",等等)。我会先尝试 GSON。

这就是网络服务中的全部内容。现在,在客户端,您必须将此字符串转换为 JavaScript 对象。

可能最简单的方法是在客户端使用JSON.parse() 显式解析它。为此,答案在这里:How to Parse JSON in JavaScript

有些人会建议你将 web 服务的 ContentType 设置为 application/json 并让 thingy 解析它。很公平,但这会很好。

【讨论】:

    【解决方案2】:

    你在做双重工作。不知道为什么你想要这个而不是在服务器上将其格式化为 json,然后将其 ajax 到格式化为 json 的客户端。但无论如何,只是为了回答你的问题DEMO

     // your stirng '{1=xxx,2=eee,3=ddd,4=rrr,D=3,R=ttt}';
     var MyObjects = [];
     //And here is how you use it:
      MyObjects = ArrayOfObjects.get('{1=xxx,2=eee,3=ddd,4=rrr,D=3,R=ttt}', 'D=3');
      //{"1":"xxx","2":"eee","3":"ddd","4":"rrr"}
      console.log(MyObjects[0]);
      //Your alerts you needed
      console.log(MyObjects[1].D, MyObjects[1].R);
    
     //Function you need
     var ArrayOfObjects = (function(){
       var splitOn = function(str, char){
       var arr = [], pos = str.indexOf(char);
       arr.push(str.slice(1, (pos-1)));
       arr.push(str.slice(pos, (str.length - 1)));
      return arr;
     },
     getObj = function (str){
       var strNew = str.replace(new RegExp('=', 'g'), ':');
       var jsonSTR = strNew.replace(/(\w+)|(\d+)/g, '"$1"');
       return JSON.parse("{"+jsonSTR+"}");
      };
    
     return {
        get: function(string, spl){
            var strings=splitOn(string, spl), retArr = [];
             strings.forEach(function(str){
             retArr.push(getObj(str));
          });
             return( retArr );
       }
     };
    })();
    

    再次,这只是对您问题的回答,而不是解决方案。解决方案是在服务器端形成正确的 JSON。

    【讨论】:

    • 是的,你在路上..你能给我包含'D'之前的键值的obj ..like '{"1":"xxx","2":"eee ","3":"ddd","4":"rrr"}'..不想要值 'D=3 和 R = ttt
    • 但是,这只是对您问题的回答,但不是解决方案。解决方案是让服务器返回 json。
    • 让我通过使用我必须设置为选择下拉框的那些值来满足我在 javascript 中的值的要求..但我无法做到这一点..我必须形成一个仅使用“D”和“3”之前的值选择下拉菜单,其中 D 是键,3 是值,例如明智的 1 是键,xxx 是值,依此类推..
    • 使用我的示例这样做:MyObjects = ArrayOfObjects.get('{1=xxx,2=eee,3=ddd,4=rrr,D=3,R=ttt}', 'D=3'); //{"1":"xxx","2":"eee","3":"ddd","4":"rrr"} console.log(MyObjects[0]);
    • 这是你想要的吗?
    【解决方案3】:

    你可以这样做:

     (function(r,x,s,a,k){
        r = {};
        s = "{1=xxx,2=eee,3=ddd,4=rrr,D=3,R=ttt}";
        a = s.replace(/[{|}]/g, "").split(",");
        for(k = 0; k < a.length; k++){
            x = a[k].split("=");
            if(x[0] == "D" || x[0] == "R") alert(x[1]); 
            else r[x[0]] = x[1];
        }
     })();
    

    res 是一个对象:

    {
     1 : xxx,
     2 : eee,
     3 : ddd,
     4 : rrr
    }
    

    但它似乎没用......也许从你的服务 API 返回一个 JSON 更好。

    也许你可以用正则表达式做同样的事情。

    【讨论】:

    • 如何从我的 java webservice 发送 Json 对象..请帮助
    • @user3185790 JSON 是一个字符串。看起来你已经发送了。你在客户端解析它:How to Parse JSON in JavaScript.
    • ...抱歉,我不是 JAVA 程序员...但我认为您需要向您的客户返回一个带有 conentType: Application/Json 的字符串...请参阅此回答:@ 987654322@
    • @Frogmouth 这真是一个糟糕的答案。您使用 JSON 解析器解析 JSON,而不是使用一些脆弱的正则表达式装置,或者更糟糕的是您在这里得到的替换/拆分怪物。我的意思是,这甚至不是正确的错误方法。
    • ... 但返回的字符串不是 JSON。所以...如果服务返回一个 JSON 字符串 JSON 解析器就是方法。
    猜你喜欢
    • 2011-02-10
    • 2015-07-17
    • 2013-07-23
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    相关资源
    最近更新 更多