2013-04-23 34 views
6

Tôi đang cố gắng tạo một đối tượng JSON liệt kê các bản đồ liên quan đến một người dùng cụ thể, nhưng chưa từng làm việc với các đối tượng JSON lồng nhau. Đây là những gì tôi muốn:Định dạng JSON trong Perl

{ 
    "success":"list of users maps", 
    "maps":[ 
     { 
     "id":"1", 
     "name":"Home to LE", 
     "date_created":"1366559121" 
     }, 
     { 
     "id":"2", 
     "name":"Test 1", 
     "date_created":"1366735066" 
     } 
    ] 
} 

với mã này perl:

my $maps = []; 
    for (my $x = 0; $x < $sth->rows; $x++) { 
    my ($id, $name, $date) = $sth->fetchrow_array(); 
    my $map = qq{{"id":"$id","name":"$name","date_created":"$date"}}; 
    push $maps, $map; 
    } 
    my $j = JSON::XS->new->utf8; 
    my $output = $j->encode({ 
    "success"=>"list of users maps", 
    "maps"=>$maps 
    }); 

Nhưng đầu ra tôi nhận được là:

{ 
    "success":"list of users maps", 
    "maps":[ 
     "{\"id\":\"1\",\"name\":\"Home to LE\",\"date_created\":\"1366559121\"}", 
     "{\"id\":\"2\",\"name\":\"Test 1\",\"date_created\":\"1366735066\"}" 
    ] 
} 

Vì vậy, khi tôi xử lý nó trong Javascript của tôi, data.maps [x] .id là không xác định. Tôi khá chắc chắn rằng đầu ra JSON được định dạng không chính xác.

Có ai có thể giúp tôi khắc phục sự cố không?

Trả lời

10

Đó là undefined vì những gì bạn có tại data.maps[x] không phải là một đối tượng, mà là một chuỗi. Vì chuỗi không có thuộc tính được gọi là id, bạn đang nhận được undefined. Tôi có lẽ muốn làm một cái gì đó như thế này (nếu tôi không thể thay đổi kịch bản perl):

var mapData = JSON.parse(data.maps[x]); 
//do stuff with mapData.id 

Nhưng điều tốt hơn để làm, là để đảm bảo rằng nó không mã hóa nó như là một chuỗi, nhưng như JSON đúng.

này một phần trong kịch bản perl của bạn:

my $map = qq{{"id":"$id","name":"$name","date_created":"$date"}}; 

chỉ đơn giản là thực hiện một chuỗi trích dẫn ra khỏi tất cả các dữ liệu đó. Thay vào đó, những gì bạn muốn là một băm perl thực sự có thể được dịch sang một bản đồ JSON/mảng kết hợp. Vì vậy, hãy thử điều này:

my $map = { 
    "id" => "$id", 
    "name" => "$name", 
    "date_created" => "$date" 
}; 
push $maps, $map; 

Bằng cách này bạn thực sự có một băm perl (thay vì chỉ một chuỗi) sẽ được dịch sang JSON thích hợp.

Như một ví dụ, tôi đã viết một số mã kiểm tra:

use strict; 
use JSON::XS; 

my $maps = []; 
push $maps, { id => 1, blah => 2 }; 
push $maps, { id => 3, blah => 2 }; 

my $j = JSON::XS->new->utf8->pretty(1); 
my $output = $j->encode({ 
    success => "list of blah", 
    maps => $maps 
}); 

print $output; 

Khi bạn chạy này, bạn nhận được:

{ 
    "success" : "list of blah", 
    "maps" : [ 
     { 
     "blah" : 2, 
     "id" : 1 
     }, 
     { 
     "blah" : 2, 
     "id" : 3 
     } 
    ] 
} 
+1

tôi nên đã nhận chuỗi hành bản thân mình! Cảm ơn, tôi đã thay đổi kịch bản perl và nó hoạt động tốt đẹp ngay bây giờ! – skeniver

+1

Lưu ý rằng trước [Perl 5.14] (http://perldoc.perl.org/perl5140delta.html#Syntactical-Enhancements "perldoc perldelta5140") 'push $ maps, ...' sẽ phải được viết là 'push @ $ maps, ... '. –

Các vấn đề liên quan