FlexJSON не сериализует объекты класса полностью - PullRequest
8 голосов
/ 08 октября 2010

Я новичок в 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)

Ответы [ 2 ]

9 голосов
/ 08 октября 2010

Flexjson работает с Java Beans, а PObject не соответствует спецификации Java Bean. Вам нужно либо добавить геттеры для своих свойств: имя, возраст и страну, либо вы должны пометить эти поля как открытые. Либо один будет работать. Добавьте сеттеры, если вы планируете использовать JSONDeserializer для десериализации вашего объекта.

0 голосов
/ 19 апреля 2016

Если вы используете 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);
}

}

...