读书人

JSON与对象相互转换有关问题

发布时间: 2013-02-06 14:02:20 作者: rapoo

JSON与对象相互转换问题
问题不是如何使用json的工具简单的转换。

如题:需要远程去调用API,API的请求和返回都是JSON格式,但是楼主不才,在转换的时候没有寻求到一个好的方法,或者是一劳永逸的方法,希望各位高手帮忙谈谈你们的见解。

场景1:请求参数格式:

{"method":"login.doLogin","params":["username","password","location"]}

对应java对象:

public class LoginBean{
private String method;
private String username;
private String password;
private String location;

// getter and setter methods
}

场景2: 请求返回格式:
[["ID","USERNAME","PASSWORD"],["DATA_ID","DATA_USERNAME","DATA_PASSWORD"]]

第一行是标题,第二行及以后才是具体的数据,都是些数组。
对应java对象:

public class UserInfo{
private String id;
private String username;
private String password;

//getter and setter methods
}


楼主现在使用GSON在转换那些名字匹配的对象,没有问题。但是对于这种全是数组,没有名字的JSON数组要转换和JAVA对象的属性相匹配,GSON就没有办法了。
之前想过自己定义注解去标注,但是由于没有写的太详细,所以简单的能够实现。
各位请问有没有好的办法可以解决这些,或者是各位有没有开源的工具借鉴来用用。 json javascript java
[解决办法]
["username","password","location"]
这种不是json格式的,在转换前,先把这样的串整理一下吧。不管你是在类里弄还是用js弄,给它们添加上key之后再转吧。

[解决办法]
{"method":"login.doLogin","params":["username","password","location"]}

method也是属性
后面["username","password","location"]中的也一样是属性,是怎么区别的
login.doLogin又用在哪了
[解决办法]
看你需求是要转换复合类型的数据。可尝试封装成list或者map。
[解决办法]
楼主你这个请求参数的格式只看到参数名,那个参数值在哪里啊
[解决办法]
params是名,里面是值的话,里面的值对应LoginBean的哪个属性啊
[解决办法]
前些日子我也专门的研究了json一天。
感觉最近遇到json问题的人挺多的。
这样,先发两个例子,最基本的json转换,你试试该,如果改不出来,回一下,我帮你写。

public class JsonToJavaBean {
public static void main(String[] args) {
String str="{\"student\":[{\"name\":\"leilei\",\"age\":23,\"gender\":true},{\"name\":\"leilei02\",\"age\":23,\"gender\":false}]}";
Student stu = null;
List<Student> list = null;
try {
ObjectMapper objectMapper=new ObjectMapper();
StudentList studentList=objectMapper.readValue(str, StudentList.class);

list=studentList.getStudent();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for(Student s:list){
System.out.println(s.getName()+" "+s.getAge()+" "+s.isGender());
}
}
}

public class JavaBeanToJson {
public static void main(String[] args) {


ArrayList<Student> list=new ArrayList<Student>();
Student s1=new Student();
s1.setName("leilei");
s1.setAge(23);
Student s2=new Student();
s2.setName("leilei02");
//s2.setAge(23);
list.add(s1);
list.add(s2);

StringWriter str=new StringWriter();

ObjectMapper objectMapper=new ObjectMapper();
try {
objectMapper.writeValue(str, list);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(str);
}
}


javaBean:
public class Student {
private String name;
private int age;
private boolean gender;
//private StudentClass studentClass;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}

public boolean isGender() {
return gender;
}
public void setGender(boolean gender) {
this.gender = gender;
}
/*public StudentClass getStudentClass() {
return studentClass;
}
public void setStudentClass(StudentClass studentClass) {
this.studentClass = studentClass;
}
@Override
public String toString() {
return "Student [age=" + age + ", name=" + name + ", studentClass="
+ studentClass + "]";
}*/
@Override
public String toString() {
return "Student [age=" + age + ", name=" + name + "]";
}


}

需要jar包:import org.codehaus.jackson.map.ObjectMapper;
我也是用api通过json传输的。
这是我遇到的那种形式:
{"error_response": {"code":"19","zh_desc":"无效access_token","en_desc":"Invalid access_token"}}
正确的会更复杂一些。
[解决办法]
楼主这个明显设计的就不对,你请求参数格式里params里面直接写值,那每个值是对应java对象里面的哪个属性都没注明,怎么转换,只有写死不能灵活。像这个params里面["username","password","location"]这里的username是值的话那是要赋给LoginBean里面的哪个属性呢,这根本就不知道,明显的设计就不好。
返回格式这个还说的过去,用二唯数组一个代表属性名,一个代表对应属性值这个还说的过去,其实跟xxx:yyy的格式数据量是一样的只是把键值对的:变成了,数据量一点也没减少,反而还增加了读取的麻烦。
[解决办法]
楼主的请求和返回格式里面如果有复合的对象属性怎么办
例如LoginBean有一个对象型的属性TempBean temp;
TempBean里面有属性
Integer tempId;String tempName;
返回格式也有这样的属性那楼主要准备怎么表示
[解决办法]
引用:
引用:
楼主的请求和返回格式里面如果有复合的对象属性怎么办
例如LoginBean有一个对象型的属性TempBean temp;
TempBean里面有属性
Integer tempId;String tempName;
返回格式也有这样的属性那楼主要准备怎么表示
我当时是给每一个bean一个父类,定义他的method,params,然后对params……

对象的属性你要怎么表示params["username","password","location"]这些都是简单对象的属性,如果像我刚才说的tempBean你要在params里面怎么写呢,难道说在用一个数组
params["username","password","location",["tempId","tempName"]];这样吗
如果是的话那放回格式是
[["ID","USERNAME","PASSWORD","tempBean.tempId","tempBean.tempName"],["DATA_ID","DATA_USERNAME","DATA_PASSWORD","tempId","tempName"]];这样的?
还是
[["ID","USERNAME","PASSWORD","tempBean","tempBean"],["DATA_ID","DATA_USERNAME","DATA_PASSWORD",["tempId","tempName"]]];这样的?
------解决方案--------------------


这个不是我们的规范啊,我就是要问,他们如果有这种对象属性的该怎么表示啊。如果都不知道要怎么表示的话,还怎么写方法来进行读取和输出啊
[解决办法]
对于复合类型最好还是要体现出上下文一致的层次性,就像用xml表示时一样

对应的话,java类中属性貌似还是有声明顺序的吧

读书人网 >J2EE开发

热点推荐