如何将JSONObject转换为带有字符串变量的JavaBean



如何将JSONObject转换为PersonBean,如下所示?我有一个带有name字段的中间Person和一个用于其他属性的List<StringList的大小不确定,但少于十个项目。

我的想法是创建带有额外String字段的PersonBean,然后手动将值从List复制到beansetter中。

但是,在创建PersonBean时,我当然会出现越界错误,因为List可能是空的:

package groupBaseX.io;
import java.util.logging.Logger;
public class PersonBeanBuilder {
private static final Logger log = Logger.getLogger(PersonBeanBuilder.class.getName());
private Person person = null;
private PersonBean personBean = new PersonBean();
private PersonBeanBuilder() {
}
public PersonBeanBuilder(Person person) {
this.person = person;
log.fine(person.toString());
log.fine(person.getName());
personBean.setName(person.getName());
String a = person.getAttributes().get(0);
String b = person.getAttributes().get(1);
String c = person.getAttributes().get(2);
String d = person.getAttributes().get(3);
String e = person.getAttributes().get(4);
personBean.setA(a);
personBean.setB(b);
personBean.setC(c);
personBean.setD(d);
personBean.setE(e);
}
public PersonBean getPersonBean() {
return personBean;
}
}

当然,我可以使用try/catch,但没有更优雅的解决方案吗?上面的代码在很大程度上是一个拼凑的代码。

因为在JSONArray中,底层JSON具有不确定的大小。出于实用目的,我只对下面每个对象的名称和前几个属性感兴趣:

[
{
"0":"z10",
"1":"y9",
"2":"x7",
"3":"atrib6",
"name":"alice"
},
{
"0":"home5",
"1":"cell4",
"name":"sue"
},
{
"0":"phone3",
"1":"phone2",
"2":"phone1",
"name":"joe"
},
{
"name":"people"
}
]

一些JSONObject当然会有零个属性,但肯定少于十个。只是想从上面的JSON创建一个JavaBean,它来自BaseX

这是我确定的一种合理的方法:

package groupBaseX.io;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;
public class PersonBeanBuilder {
private static final Logger log = Logger.getLogger(PersonBeanBuilder.class.getName());
private Person person = null;
private PersonBean personBean = new PersonBean();
private PersonBeanBuilder() {
}
public PersonBeanBuilder(Person person) {
this.person = person;
}
public PersonBean getPersonBean() {
personBean.setName(person.getName());
Map<String, AF> map = new HashMap<>();
AF attributeField = AF.GARBAGE;
person.getAttributes().forEach((s) -> {
map.put(s, attributeField.getType(s));
});
for (String key : map.keySet()) {
switch (map.get(key)) {
case HOME_PHONE:
log.fine(AF.HOME_PHONE.toString());
personBean.setHomePhone1(key);
break;
default:
log.fine(AF.HOME_PHONE.toString());
break;
}
}
return personBean;
}
}

enum:

package groupBaseX.io;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
public class AttributeParser {
private static final Logger log = Logger.getLogger(AttributeParser.class.getName());
private List<String> attributes = new ArrayList<>();
private AttributeParser() {
}
public AttributeParser(List<String> attributes) {
this.attributes = attributes;
}
// ^(+d{1,2}s)?(?d{3})?[s.-]d{3}[s.-]d{4}$  phone
// ^d{5}(?:[-s]d{4})?$     zip
public void foo() {
boolean isPhone = false;
boolean isZip = false;
for (String s : attributes) {
int x = 3;
isPhone = false;
isZip = false;
}
}
}

但是,还是很尴尬。起点是JSON,所以我相信比我聪明的猴子已经想到了这一点。

最新更新