2009-10-02 25 views
10

Bir dizeden dinamik bir nesneyi nasıl oluşturabilirim?Nesne oluşturma createcript 3.0 içinde bir dize oluşturur (as3)

var s1:String = '{x:200, y:400}'; 
var o1:Object = Object(s1); 

trace(o1); // result = {x:200, y:400} 
trace(o1.x) // result = ReferenceError: Error #1069: Property x not found on String and there is no default value. 
trace(o1.y) // result = ReferenceError: Error #1069: Property x not found on String and there is no default value. 

aşağıdaki çıkışına önceki kodu istiyorum:

Burada yanlış sonuçlarla benim geçerli kod önceden

trace(o1); // result = [object Object] 
trace(o1.x); // result = 200 
trace(o1.y); // result = 400 

teşekkürler!

cevap

4

as3corelib, bunu sizin için yapacak bir JSON ayrıştırıcısı içerir. Bu kütüphanenin yeni sürümleri olmadığı için issues list'u incelediğinizden emin olun ve çok sayıda hata vardır, bunlar çoğunlukla sorun listesinde ele alınır.

+1

Aynı şeyi cevaplamak üzereydim :) sorunla çözmeye 'JSON sınıfını o lib: 'JSON.decode (str)' ve 'JSON.encode (obj)' diğer yoldan kullanacak. – JStriedl

+0

Hatalar hakkında, bunu düzelten insanlar var. Bakınız: http://code.google.com/p/as3corelib/source/list. Sadece SVN'den kontrol etmeniz gerekiyor. –

+0

Dediğim gibi, "yeni sürüm yok", ama evet, bunu bilmek güzel. – spender

4

bu en iyi yol olup olmadığını bilmek, ama yok:

var serializedObject:String = '{x:200,y:400}' 
var object:Object = new Object() 

var contentWithoutBraces:String = serializedObject.substr(serializedObject.indexOf('{') + 1) 
contentWithoutBraces = contentWithoutBraces.substr(0, contentWithoutBraces.lastIndexOf('}')) 

var propertiesArray:Array = contentWithoutBraces.split(',') 

for (var i:uint = 0; i < propertiesArray.length; i++) 
{ 
    var objectProperty:Array = propertiesArray[i].split(':') 

    var propertyName:String = trim(objectProperty[0]) 
    var propertyValue:String = trim(objectProperty[1]) 

    object[propertyName] = Object(propertyValue) 
} 

trace(object) 
trace(object.x) 
trace(object.y) 

İstediğin yapacağız.

nesne de dönüştürülür diğer nesneleri içeriyorsa böylece bir özyinelemeli şekilde yapabilirsiniz;)

PS: Ben Trim fonksiyonunu katmayan, fakat bu fonksiyon bir String alma ve yeni bir dize döndürür Dize başında veya sonunda boşluk olmadan.

3

Kayıt için, JSON üye adları etrafında teklifler gerektirdiğinden, JSON ayrıştırıcısı örnekte dizeyi ayrıştırmaz. Yani dize:

var s1:String = '{x:200, y:400}'; 

... yerine olurdu olmak:

var s1:String = '{"x":200, "y":400}'; 

Sanki o nesne gösterimi biraz kafa karıştırıcı olabilir {x: 200, y: 400}, yani hem ActionScript'te hem de JavaScript'de geçerli olan geçerli bir JSON değildir, ancak doğru hatırlıyorsam, üye isimlerindeki alıntılar, saklı sözcüklerle olası çakışmaları önlemek için gereklidir.

http://simonwillison.net/2006/Oct/11/json/