2010-10-08 82 views
7

我是FlexJson的新手,并且在简单教程中遵循http://flexjson.sourceforge.net/
我写了一个简单的程序,但它似乎没有序列化对象属性。请帮我,如果有人知道这个FlexJSON不会完全序列化类对象

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); 

    } 
} 

输出:

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) 

(更新缺失了答案):

我尝试使用getter/setter方法修改代码,现在它没有说下面的内容。我很抱歉,如果我做错了,我是新来这个

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); 

    } 
} 

输出:

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) 

回答

8

Flexjson工作过的Java Bean和PObject不遵循Java Bean的规范。您可能需要为属性添加getter:姓名,年龄和国家,或者您需要将这些字段标记为公开。任何一个都可以工作。如果您计划使用JSONDeserializer反序列化对象,请添加setter。

+0

嗨,chubbsondubs,我也有类似problem.Does其影响,如果你的getter和setter方法是私有的或你的构造函数是私有的? – faizan 2012-10-04 09:56:22

+0

您还可以为Java Bean Specification提供一个好的链接。 在此先感谢。 – faizan 2012-10-04 10:01:28

+0

您可以将getter/setter标记为private或protected,并且Flexjson将其选中。构造函数也一样。 – chubbsondubs 2012-10-04 23:58:46

0

如果您在使用Spring 3或以上,那么你不得不移除

map.remove( “org.springframework.validation.BindingResult.string”)的入门;

来自序列化之前的模型映射。它像一个魅力。你最好在视图组件中执行视图。 看看下面的代码。

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); 
} 

}