【问题标题】:Converting JSON format string into a real object in Angular在Angular中将JSON格式字符串转换为真实对象
【发布时间】:2016-06-09 08:56:38
【问题描述】:

我有一个 JSON 格式字符串,我想将其添加为附加到发布请求的参数。

我正在尝试执行请求,当我执行请求时,我从我的网络服务收到此错误:

#0 /opt/assets/WS/ws.php(48): Slim\Slim::handleErrors(8, 'Trying to get p...', '/opt/assets/WS/...', 48, Array)
#1 [internal function]: {closure}()
#2 /opt/assets/WS/vendor/slim/slim/Slim/Route.php(468): call_user_func_array(Object(Closure), Array)
#3 /opt/assets/WS/vendor/slim/slim/Slim/Slim.php(1357): Slim\Route->dispatch()
#4 /opt/assets/WS/vendor/slim/slim/Slim/Middleware/Flash.php(85): Slim\Slim->call()
#5 /opt/assets/WS/vendor/slim/slim/Slim/Middleware/MethodOverride.php(92): Slim\Middleware\Flash->call()
#6 /opt/assets/WS/vendor/slim/slim/Slim/Middleware/PrettyExceptions.php(67): Slim\Middleware\MethodOverride->call()
#7 /opt/assets/WS/vendor/slim/slim/Slim/Slim.php(1302): Slim\Middleware\PrettyExceptions->call()
#8 /opt/assets/WS/ws.php(59): Slim\Slim->run()
#9 {main}

就像请求不包含真正的 JSON 对象一样。我怎样才能改变它?我做了一些技巧,但似乎不起作用。 这是我的脚本:

assets.controller('AfegirTipusActiusCtrl', function ($scope, $http){

                    // Camps formulari text pla
                 /*   $scope.nomAtribut = "<input type='text' name='firstname'>";
                    $scope.mida = "<input type='number' name='firstname'>";
                    $scope.obligatori = "<input type='checkbox' name='vehicle' value='yes'>";   */

                    // Construeix combo
                    $http.get('http://10.0.203.73/WS/ws.php/getCombo/1').success(function(data) {
                        $scope.options = data;
                    });

                    $scope.atributs = [];

                    $scope.addRow = function(){
                        var newRow = {
                            nomAtribut: "",
                            tipus: "",
                            mida: "",
                            prioritat: "",
                            obligatori: "",
                            observacions: ""
                        }
                        $scope.atributs.push(newRow);
                    }

                   /* $scope.addField = function() {
                        $scope.atributs.push(newRow);
                    };*/

                    $scope.prioritat = $scope.atributs.length;

                    // Envia atributs a WS
                    $scope.sendRow = function(){
                        var d = "{'nomAtribut': 'marca','tipus': 'String','mida': '15','prioritat': '1','obligatori': 'No'}";
                        $http.post("http://10.0.203.73/WS/ws.php/tipusactius/alta", angular.toJson(d)).success(function(data){
                            $scope.status = data;
                        })
                    }
            });

编辑:

我还添加了解析请求的 php Slim 函数:

 $app->post('/tipusactius/alta', function () use ($app) {
        $json = $app->request->getBody();
        header("Content-Type: application/json");
        $json_decode = json_decode($json); // $json_decode conte l'bjecte format a partir del json del request
        echo $json_decode->{'tipus'};

     //   $sql = "INSERt INTO atributs_actiu (nomAtribut, midaAtribut, tipus_actius_idtipus_actius, atributObligatori, ordre, tipusAtributs_idTipus, observacions
     //                  , combo_idcombo, combo_codi) values ('".$json_decode->{'nomAtribut'}."', '".$json_decode->{'mida'}."', 1, '0', 1, 1, 'atribut de prova', 1, 1)";
        $sql = "INSERt INTO atributs_actiu (nomAtribut, midaAtribut, tipus_actius_idtipus_actius, atributObligatori, ordre, tipusAtributs_idTipus, observacions
                       , combo_idcombo, combo_codi) values ('".$json_decode->{'nomAtribut'}."', '3', 1, '0', 1, 1, 'atribut de prova', 1, 1)";

        $mysqli=getDB();
        $result = $mysqli->query($sql);
 });

已解决: 就像@vidriduch 所说的那样:

$scope.sendRow = function() {
    var d = {
        'nomAtribut': 'marca',
        'tipus': 'String',
        'mida': '15',
        'prioritat': '1',
        'obligatori': 'No'
    };

    $http.post("http://10.0.203.73/WS/ws.php/tipusactius/alta", angular.toJson(d)).success(function(data) {
        $scope.status = data;
})};

【问题讨论】:

  • 使用JSON.parse(d)
  • 您在字符串上使用angular.toJson。你不是说angular.fromJson吗?
  • angular.toJSON 类似于 JSON.stringify,因此 d 应该是一个对象而不是字符串 -> var d = { 'nomAtribut': 'marca','tipus': 'String',' mida': '15','prioritat': '1','obligori': '否'}; docs.angularjs.org/api/ng/function/angular.toJson

标签: javascript jquery angularjs web-services slim


【解决方案1】:

如果要将JSON 字符串转换为JavaScript 对象,则应使用angular.fromJson() method

另外,请确保在JSON 中将单引号' 转换为双引号"

// ' becomes " in your string
var d = '{"nomAtribut": "marca","tipus": "String","mida": "15","prioritat": "1","obligatori": "No"}';

$http.post("http://10.0.203.73/WS/ws.php/tipusactius/alta", angular.fromJson(d))
.success(function(data){
    $scope.status = data;
}

【讨论】:

  • 为什么要先转换成对象再转换成字符串?
  • @MattLishman 我试过你的答案,但它不起作用我从网络服务收到同样的错误
  • @proktovief 你能看到网络标签中发送的内容吗?它发送的数据是否正确?
  • @MattLishman 这是发送的内容:"{\"nomAtribut\": \"marca\",\"tipus\": \"String\",\"mida\": \" 15\",\"prioritat\":\"1\",\"obligori\":\"No\"}"
【解决方案2】:

确保您的 JSON 参数没有被任意引用锁定。

将 JSON 字符串分配给变量并直接传递将在这里工作。

【讨论】:

    【解决方案3】:

    angular.toJson 将输入序列化为 JSON 格式的字符串

    https://docs.angularjs.org/api/ng/function/angular.toJson

    在您的情况下,您正在序列化字符串 ...

    您的代码可能如下所示:

    $scope.sendRow = function() {
        var d = {
            'nomAtribut': 'marca',
            'tipus': 'String',
            'mida': '15',
            'prioritat': '1',
            'obligatori': 'No'
        };
    
        $http.post("http://10.0.203.73/WS/ws.php/tipusactius/alta", angular.toJson(d)).success(function(data) {
            $scope.status = data;
    })};
    

    【讨论】:

      猜你喜欢
      • 2013-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-01
      • 2012-12-25
      • 1970-01-01
      • 2019-08-27
      • 2020-05-27
      • 1970-01-01
      相关资源
      最近更新 更多