【问题标题】:FlexJSON doesn't serialize class objects fullyFlexJSON 没有完全序列化类对象
【发布时间】:2010-10-08 04:44:55
【问题描述】:

我是 FlexJson 的新手,正在关注 http://flexjson.sourceforge.net/ 以获得简单的教程。
我写了一个简单的程序,但似乎没有序列化对象属性。如果有人知道,请帮助我

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)

【问题讨论】:

    标签: java json flexjson


    【解决方案1】:

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

    【讨论】:

    • 嗨,chubbsondubs,我遇到了类似的问题。如果你的 getter 和 setter 是私有的,或者你的构造函数是私有的,它会影响吗?
    • 能否请您提供一个Java Bean规范的好链接。提前致谢。
    • 您可以将 getter/setter 标记为私有或受保护,Flexjson 会选择它。构造函数也是如此。
    • 谢谢,这让我意识到我的一个二传手名字不正确。
    • 即使所有 getter/setter 都正确命名,我们也面临这个问题。
    【解决方案2】:

    如果您使用的是 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);
    }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-08
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多