2010-10-08 11 views
7

FlexJson'da yeniyim ve basit bir eğitici için http://flexjson.sourceforge.net/'u takip ediyordum.
Basit bir program yazdım ancak nesne özniteliklerini serileştirmemek gibi görünüyor.FlexJSON, sınıf nesnelerini tam olarak serileştirmez.

init: 
deps-module-jar: 
deps-ear-jar: 
deps-jar: 
compile-single: 
run-main: 
harit - 23 - india 
S : {"class":"com.webapp.enter.PObject"} 
BUILD SUCCESSFUL (total time: 0 seconds) 

(silindi cevabını Güncelleme):

ben alıcı/ayarlayıcı yöntemleri kullanılarak kodunu değiştirmek çalıştı şimdi, birisi bu

package com.webapp.enter; 

import flexjson.JSONSerializer; 

class PObject { 

     String name; 
     int age; 
     String country; 

     public PObject (String n, int a , String c){ 
      this.name = n; 
      this.country = c; 
      this.age = a; 
     } 

     public String toString(){ 
      return this.name + this.age + this.country; 
     } 

     public String[] getData(){ 
      return new String[]{ this.name, this.country}; 
     } 
} 

public class Person{ 

    public static void main(String main[]){ 
     PObject person = new PObject("harit",23,"india"); 
     System.out.println(person.name + " - " + person.age + " - " + person.country); 

     JSONSerializer serializer = new JSONSerializer(); 
     String out = serializer.serialize(person); 
     System.out.println("S : " + out); 

    } 
} 

Çıktı haberi varsa bana yardım edin Aşağıdakileri söyleyerek başarısız olur.

test - 23 - usa 
Exception in thread "main" flexjson.JSONException: Error trying to deepSerialize 
     at flexjson.transformer.ObjectTransformer.transform(ObjectTransformer.java:97) 
     at flexjson.transformer.TransformerWrapper.transform(TransformerWrapper.java:22) 
     at flexjson.JSONContext.transform(JSONContext.java:75) 
     at flexjson.JSONSerializer.serialize(JSONSerializer.java:378) 
     at flexjson.JSONSerializer.deepSerialize(JSONSerializer.java:301) 
     at com.webapp.enter.Person.main(Person.java:60) 
Caused by: java.lang.IllegalAccessException: Class flexjson.transformer.ObjectTransformer can not access a member of class com.webapp.enter.PObject with modifiers "public" 
     at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:95) 
     at java.lang.reflect.Method.invoke(Method.java:607) 
     at flexjson.transformer.ObjectTransformer.transform(ObjectTransformer.java:45) 
     ... 5 more 
Java Result: 1 
BUILD SUCCESSFUL (total time: 0 seconds) 

cevap

8

Flexjson Java Beans kapalı çalışır ve PObject Java Bean şartname takip etmez: Ben yanlış yapıyorum eğer ben bu

package com.webapp.enter; 

import flexjson.JSONSerializer; 

class PObject { 

     String name; 
     int age; 
     String country; 

     public PObject(){ 

     } 

     public void setName(String name){ 
      this.name = name; 
     } 

     public void setAge(int age){ 
      this.age = age; 
     } 

     public void setCountry(String country){ 
      this.country = country; 
     } 

     public String getName(){ 
      return this.name; 
     } 

     public int getAge(){ 
      return this.age; 
     } 

     public String getCountry(){ 
      return this.country; 
     } 

} 

public class Person{ 

    public static void main(String main[]){ 
     PObject person = new PObject(); 
     person.setAge(23); 
     person.setCountry("usa"); 
     person.setName("test"); 
     System.out.println(person.name + " - " + person.age + " - " + person.country); 

     JSONSerializer serializer = new JSONSerializer(); 
     String out = serializer.serialize(person); 
     System.out.println("S : " + out); 

    } 
} 

Çıktı için yeni, özür dileriz. İsterseniz mülkleriniz için alıcılar eklemelisiniz: ad, yaş ve ülke veya bu alanları herkese açık olarak işaretlemeniz gerekir. Ya biri işe yarayacak. Nesnenizi serileştirmek için JSONDeserializer kullanmayı planlıyorsanız setter ekleyin.

+0

Merhaba, chubbsondubs, ben alıcı ve ayarlayıcılar özeldir eğer etkileyecek benzer problem.Does vardı ya da yapıcı özeldir? – faizan

+0

Ayrıca, Java Bean Spesifikasyonu için iyi bir link verebilirsiniz. Şimdiden teşekkürler. – faizan

+0

Alıcı/ayarlayıcıyı özel veya korumalı olarak işaretleyebilir ve Flexjson onu kaldıracaktır. Aynı yapıcı için de geçerli. – chubbsondubs

0

Eğer Spring 3 ile ya da daha sonra Yukarıdaki

map.remove ("org.springframework.validation.BindingResult.string") gibi girişi kaldırmak için varsa; Serileştirmeden hemen önce model haritasından

. Bir çekicilik gibi çalışır. Görünümü uyguladığınız görünüm bileşeninde bunu yapmanız daha iyidir. Aşağıdaki koda bir göz atın.

public class JsonView implements View{ 

@Override 
public String getContentType() { 
    return "application/json"; 
} 

@Override 
public void render(Map<String, ?> map, HttpServletRequest hsr, HttpServletResponse response) throws Exception { 
    map.remove("org.springframework.validation.BindingResult.string"); 
    final String data = new JSONSerializer().deepSerialize(map); 

    response.getWriter().write(data); 
} 

}