java常用json解析数据方法
在日常开发中,常用的java 解析json数据笔记
{ id: "12e3232r34r334t34t3", code: "FieldColumn", fieldType: "FieldColumn",
propertiesList: [ { code: "PropName", value:
"791b025ac3a116a12e86a42e0f558f0c", widget: "FieldSubTable", }, code:
"PropTableName", value: "tableHead2" }, { code: "PropType", type: "text",
value: "", attr: "" }, { code: "PropReadOnly", value: false, cal: "" }, { code:
"PropBT", value: false }, { code: "PropSubTableId", index: 2, value:
"d8be1d4dffcf7944ee5a7bfc7dc0f789" } ] }
类似这种结构的json数据,我们具体想拿到它的一部分值,我们该如何操作呢?
首先,我们从数据可以看出这是一个{[{},{},{},{},{}......]}的数据集合,它里面的数据分别是的形式
code: "PropSubTableId", index: 2, value: "d8be1d4dffcf7944ee5a7bfc7dc0f789"
所以我们可以把这个json数据集合转变为一个list<>的形式接收一下,也可以把它同化为一个string的字符串;具体代码如下:
//使用这两个注解是为了将我传的值方便其他功能引用 @Data @XmlRootElement
//这个解释代码类PropSubColumn继承了BaseProperty类 public class PropSubColumn extends
BaseProperty { //我需要往xml里传值,所以定义了id,parentCode,propBT...等私有参数;方便传值
private String id; private String parentCode; private Boolean propBT;
private String tableName; private String tableLabel; private Boolean
show; private String propWidth; private PropType propType; private
PropReadOnly propReadOnly; private PropSubTableId propSubTableId;
//下面方法是处理传过来的jsonObject数据 public static PropSubColumn format(JSONObject
property) { PropSubColumn propSubColumn = new PropSubColumn();
//因为传过来的数据是key,value形式的json字符串,所以可直接传值
propSubColumn.setId(property.getString("id"));
propSubColumn.setParentCode((String) property.get("parentCode"));
//但是这个json字符串里还有一个[{},{}...]json数组,所以先使用字符串接收一下 String propertiesList =
property.get("propertiesList").toString(); String tableName = "";
String tableLabel = ""; Boolean isShow = true; String propWidth
= ""; Boolean propBT = false;
//需要判断数据是否为空,如果传过来的数组不为空,执行下面for循环,获取数据然后传值 if
(StringUtilExt.isNotEmpty(propertiesList)) {
//我们现在需要先把String类型的字符串,转为list<Map>类型的数据,因为数据都是{key,value}形式的
List<Map> properties = JSONArray.parseArray(propertiesList, Map.class);
//开始进入for循环 for (int i = 0; i < properties.size(); i++) {
Map propertie = properties.get(i);
//下面都是在循环中判断取得的值是否为我们需要的数据,所以使用了if,如果是则直接获取该key的value值然后传值 if
(FcsPropertyNameConstants.PROPERTY_PROPTABENAME.equals(propertie.get("code")))
{ tableName = propertie.get("value").toString();
} if
(FcsPropertyNameConstants.PROPERTY_PROPTABELABEL.equals(propertie.get("code")))
{ tableLabel = propertie.get("value").toString();
} if
(FcsPropertyNameConstants.PROPERTY_PROPBT.equals(propertie.get("code"))) {
propBT = (Boolean) propertie.get("value"); }
if
(FcsPropertyNameConstants.PROPERTY_ISSHOW.equals(propertie.get("code"))) {
isShow = (Boolean) propertie.get("value"); }
if
(FcsPropertyNameConstants.PROPERTY_PROPWIDTH.equals(propertie.get("code"))) {
propWidth = (String) propertie.get("value"); }
if
(FcsPropertyNameConstants.PROPERTY_PROPTYPE.equals(propertie.get("code"))) {
PropType propType = new PropType();
propType.setValue(propertie.get("value").toString());
propType.setAttr(propertie.get("attr").toString());
propType.setType(propertie.get("type").toString());
propSubColumn.setPropType(propType); } if
(FcsPropertyNameConstants.PROPERTY_PROPRREADONLY.equals(propertie.get("code")))
{ PropReadOnly propReadOnly = new PropReadOnly();
propReadOnly.setCal(propertie.get("cal").toString());
propReadOnly.setValue((Boolean) propertie.get("value"));
propSubColumn.setPropReadOnly(propReadOnly); } if
(FcsPropertyNameConstants.PROPERTY_PROPSUBTABLEID.equals(propertie.get("code")))
{ PropSubTableId propSubTId = new PropSubTableId();
propSubTId.setIndex(propertie.get("index").toString());
propSubTId.setValue(propertie.get("value").toString());
propSubColumn.setPropSubTableId(propSubTId); } }
propSubColumn.setTableName(tableName);
propSubColumn.setPropBT(propBT);
propSubColumn.setTableLabel(tableLabel);
propSubColumn.setShow(isShow);
propSubColumn.setPropWidth(propWidth); //这个是如果一开始数据为空时的必要操作 } else {
propSubColumn.setTableName("");
propSubColumn.setTableLabel(""); propSubColumn.setShow(true);
propSubColumn.setPropWidth("");
propSubColumn.setPropType(null);
propSubColumn.setPropReadOnly(null);
propSubColumn.setPropSubTableId(null); } return
propSubColumn; } }
为转化后的xml:
<subColumns> <subColumn>
<id>68c01e156ef77e07918cf3160adbe7f3</id>
<parentCode></parentCode> <propBT>false</propBT>
<tableName>tableHead2</tableName>
<tableLabel>名称</tableLabel> <show>true</show>
<propWidth></propWidth> <propType
type="text" attr=""></propType> <propReadOnly
cal="">false</propReadOnly> <propSubTableId
index="2">d8be1d4dffcf7944ee5a7bfc7dc0f789</propSubTableId>
</subColumn> </subColumns>
该笔记不完整的,只是记录了json数据字符串携带的值,我们该从for循环中如何取出来,然后传值;json数据是从数据库中取出的数据生成的,本人工作笔记!!!然后,为什么要转为xml呢?因为公司的一个表单项目,我们要实现表单的导入、导出功能!导出给用户的需要的是xml结构的数据文件,方便我们读取的时候能逐个xml结构读取数据,xml的读取导入、导出使用JAXB,java原生自带的工具类,贴上使用的代码:我们使用的是这个方法:
public static void convertToXml(Object obj, Writer writer) {
import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import
javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; import
java.io.*; /** * 封装了XML转换成object,object转换成XML的代码 * * @author hongkaiqing */
public class XmlUtil { /** * 将对象直接转换成String类型的 XML输出 * * @param obj * @return
*/ public static String convertToXml(Object obj) { // 创建输出流 StringWriter sw =
new StringWriter(); try { // 利用jdk中自带的转换类实现 JAXBContext context =
JAXBContext.newInstance(obj.getClass()); Marshaller marshaller =
context.createMarshaller(); // 格式化xml输出的格式
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); //
将对象转换成输出流形式的xml marshaller.marshal(obj, sw); } catch (JAXBException e) {
e.printStackTrace(); } return sw.toString(); } /** * 将对象根据路径转换成xml文件 * * @param
obj * @param writer * @return */ public static void convertToXml(Object obj,
Writer writer) { try { // 利用jdk中自带的转换类实现 JAXBContext context =
JAXBContext.newInstance(obj.getClass()); Marshaller marshaller =
context.createMarshaller(); // 格式化xml输出的格式
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); //
是否省略xm头声明信息 marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); // 将对象转换成输出流形式的xml
// 创建输出流 marshaller.marshal(obj, writer); } catch (JAXBException e) {
e.printStackTrace(); } } @SuppressWarnings("unchecked") /** *
将String类型的xml转换成对象 */ public static Object convertXmlStrToObject(Class clazz,
String xmlStr) { Object xmlObject = null; try { JAXBContext context =
JAXBContext.newInstance(clazz); // 进行将Xml转成对象的核心接口 Unmarshaller unmarshaller =
context.createUnmarshaller(); StringReader sr = new StringReader(xmlStr);
xmlObject = unmarshaller.unmarshal(sr); } catch (JAXBException e) {
e.printStackTrace(); } return xmlObject; } @SuppressWarnings("unchecked") /** *
将file类型的xml转换成对象 */ public static Object convertXmlFileToObject(Class clazz,
Reader reader) { Object xmlObject = null; try { JAXBContext context =
JAXBContext.newInstance(clazz); Unmarshaller unmarshaller =
context.createUnmarshaller(); // FileReader fr = null; // try { // fr = new
FileReader(xmlPath); // } catch (FileNotFoundException e) { //
e.printStackTrace(); // } xmlObject = unmarshaller.unmarshal(reader); } catch
(JAXBException e) { e.printStackTrace(); } return xmlObject; } }
然后就可以根据实际开发运用啦