一、保持字段顺序
在JSON转JSONObject过程中,很多情况下需要保证输出的JSONObject中各字段的顺序与原来的JSON对象中保持一致,而不是按照默认的字典序排序。这种需求在解析某些数据时非常常见。下面是一个保持字段顺序的具体示例:
import com.alibaba.fastjson.JSONObject; public class JsonConverter { public static JSONObject restoreOrder(JSONObject jsonObject) { Mapmap = new LinkedHashMap<>(); // 使用LinkedHashMap保证顺序 for (Map.Entry entry : jsonObject.entrySet()) { String key = entry.getKey(); Object value = entry.getValue(); if (value instanceof JSONObject) { value = restoreOrder((JSONObject) value); // 递归解析JSONObject的子对象 } map.put(key, value); } return new JSONObject(map); } }
上述代码通过递归解析JSONObject的子对象,并使用LinkedHashMap保存子对象条目的顺序,最终按照原有顺序输出JSONObject对象。
二、JSON转Excel
将JSON转换为Excel表格是一种常见需求,这种转换通常用于数据可视化,或者用于对数据进行分析和处理。Java中提供了多种Excel生成工具,比如POI、JExcelApi等。下面是一个使用POI进行JSON转Excel的例子:
import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import java.io.FileOutputStream; import java.util.Iterator; public class JsonConverter { public static void convertToExcel(JSONObject jsonObject, String outputFilePath) throws Exception { Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet(); // 添加表头 Row headerRow = sheet.createRow(0); Iteratorkeys = jsonObject.keySet().iterator(); int i = 0; while (keys.hasNext()) { Cell cell = headerRow.createCell(i); cell.setCellValue(keys.next()); i++; } // 添加数据 JSONArray jsonArray = jsonObject.getJSONArray("data"); for (int j = 0; j < jsonArray.size(); j++) { Row row = sheet.createRow(j + 1); // 表头占用了第一行,所以从第二行开始添加数据 JSONObject dataObject = jsonArray.getJSONObject(j); Iterator dataKeys = dataObject.keySet().iterator(); int k = 0; while (dataKeys.hasNext()) { Cell cell = row.createCell(k); cell.setCellValue(dataObject.getString(dataKeys.next())); k++; } } // 输出Excel文件 FileOutputStream fileOutputStream = new FileOutputStream(outputFilePath); workbook.write(fileOutputStream); fileOutputStream.close(); } }
上述代码将JSONObject对象中的数据输出到Excel文件中。
三、JSON转Protobuf
Protobuf是Google开发的一种二进制序列化协议,可以简化数据的序列化和反序列化过程,同时提供了更好的性能和更小的数据传输体积。下面是一个示例,展示如何将JSON对象转换为Protobuf格式:
syntax = "proto3"; message Person { string name = 1; int32 age = 2; } message PersonList { repeated Person items = 1; } import com.alibaba.fastjson.JSONObject; import com.google.protobuf.ByteString; import com.google.protobuf.InvalidProtocolBufferException; public class JsonConverter { public static PersonList convertToProtobuf(JSONObject jsonObject) { PersonList.Builder builder = PersonList.newBuilder(); JSONArray jsonArray = jsonObject.getJSONArray("data"); for (int i = 0; i < jsonArray.size(); i++) { JSONObject dataObject = jsonArray.getJSONObject(i); Person.Builder personBuilder = Person.newBuilder(); personBuilder.setName(dataObject.getString("name")); personBuilder.setAge(dataObject.getInteger("age")); builder.addItems(personBuilder.build()); } return builder.build(); } public static JSONObject convertFromProtobuf(PersonList personList) throws InvalidProtocolBufferException { JSONObject result = new JSONObject(); JSONArray jsonArray = new JSONArray(); ListpersonListItems = personList.getItemsList(); for (Person person : personListItems) { JSONObject personObject = new JSONObject(); personObject.put("name", person.getName()); personObject.put("age", person.getAge()); jsonArray.add(personObject); } result.put("data", jsonArray); return result; } public static ByteString serialize(PersonList personList) { return personList.toByteString(); } public static PersonList deserialize(ByteString bytes) throws InvalidProtocolBufferException { return PersonList.parseFrom(bytes); } }
上述代码定义了一个Protobuf的数据结构,用于存储Person对象。其中,PersonList对象包含了多个Person对象,且Person对象的关键字段包括name和age。convertToProtobuf方法将JSONObject对象转换为PersonList对象,而convertFromProtobuf方法则是将PersonList对象反序列化为JSONObject对象。serialize和deserialize方法分别将PersonList对象序列化为二进制格式和反序列化为PersonList对象。
四、JSON转XML
XML是另一种常见的数据交换格式,而Java也提供了多种将Java对象转换为XML格式的工具库,比如JAXB、XStream等。下面是一个使用JAXB进行JSON转XML的示例:
import com.alibaba.fastjson.JSONObject; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import java.io.StringWriter; public class JsonConverter { public static String convertToXml(JSONObject jsonObject) throws JAXBException { // 创建JAXBContext对象,用于转换Java对象到XML文件 JAXBContext jaxbContext = JAXBContext.newInstance(Container.class); Marshaller marshaller = jaxbContext.createMarshaller(); // 设置marshaller,保证生成的XML文件具有良好的可读性 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); Container container = new Container(); JSONArray jsonArray = jsonObject.getJSONArray("data"); for (int i = 0; i < jsonArray.size(); i++) { JSONObject dataObject = jsonArray.getJSONObject(i); Data data = new Data(); data.setName(dataObject.getString("name")); data.setAge(dataObject.getInteger("age")); container.getData().add(data); } StringWriter stringWriter = new StringWriter(); marshaller.marshal(container, stringWriter); return stringWriter.toString(); } } @XmlRootElement class Container { private List data = new ArrayList<>(); @XmlElement(name = "data") public List getData() { return data; } } class Data { private String name; private Integer age; @XmlElement public String getName() { return name; } public void setName(String name) { this.name = name; } @XmlElement public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
上述代码创建了Container和Data两个POJO,在convertToXml方法中,将JSONObject对象按照XML数据结构填充到Container对象中,并使用JAXBContext和Marshaller将Container对象转换为XML字符串。
五、jQuery转JSON
jQuery是一个流行的JavaScript库,它提供了丰富和易于使用的API,用于简化HTML文档的遍历和操作。在页面中引入jQuery之后,可以通过下述方式获取JSON对象:
var jsonObject = $.parseJSON(str); // str是一个JSON格式字符串
上述代码中,$.parseJSON方法将JSON格式字符串转换为JSONObject对象。
六、JSON转String
将JSON对象转换为字符串通常用于将JSON数据上传到服务器端或者输出到客户端。Java的fastjson库提供了多个将JSON对象转换为字符串的API,比如toJSONString、toJSON等。下面是一个toJSONString的例子:
import com.alibaba.fastjson.JSONObject; public class JsonConverter { public static String convertToString(JSONObject jsonObject) { return jsonObject.toJSONString(); } }
上述代码使用toJSONString方法将JSONObject对象转换为字符串。
七、JSON转换
除了JSON转换成JSONObject、XML等格式之外,还可以对JSON数据进行一些转换操作。Java的fastjson库提供了多个JSON转换方法,比如toJavaObject、toJSONString、toJSON等。下面是一个toJavaObject的例子:
import com.alibaba.fastjson.JSONObject; public class JsonConverter { public static Person convertToJavaObject(JSONObject jsonObject) { return jsonObject.toJavaObject(Person.class); } } class Person { private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
上述代码中,使用fastjson的toJavaObject方法将JSONObject转换为Java对象Person。
八、JSON串转Map
将JSON格式的字符串转换为Java的Map类型也是一种常见需求,Java的fastjson库同样提供了相关API。下面是一个示例代码:
import com.alibaba.fastjson.JSON; import java.util.Map; public class JsonConverter { public static MapconvertToMap(String jsonString) { return JSON.parseObject(jsonString, new TypeReference
上述代码中,通过JSON.parseObject将JSON格式的字符串转换为Map类型。