一、Json转Object方法
Json是一种轻量级的数据交换格式,在前后端分离开发中起到了非常重要的作用。Json转Object是将Json字符串转化为对应的Java对象的过程。下面是一个简单的Json字符串:
{ "name": "张三", "age": 18, "gender": "男" }
要将上述Json字符串转化为对应的Java对象,我们需要使用Json的解析库。Gson是Google公司提供的一款非常优秀的Java解析Json库,使用它可以很方便地将Json字符串转化为Java对象。示例代码如下:
import com.google.gson.Gson; public class JsonToObject { public static void main(String[] args) { String jsonString = "{\"name\":\"张三\",\"age\":18,\"gender\":\"男\"}"; Gson gson = new Gson(); Person person = gson.fromJson(jsonString, Person.class); System.out.println(person); } } class Person { private String name; private Integer age; private String gender; // getters and setters @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", gender='" + gender + '\'' + '}'; } }
上述代码中,我们使用Gson的fromJson方法将Json字符串转化为Person对象。需要注意的是,Person对象中的属性名称和Json字符串中的属性名称是一致的。
二、Json转Object字段不对应
有时候,我们在将Json字符串转化为Java对象时,发现Json字符串中的属性名称和Java对象中的属性名称不一致。这时,我们可以使用Gson的@SerializedName注解来解决这个问题。@SerializedName可以将属性名和Json字符串中的属性名进行映射。示例代码如下:
import com.google.gson.Gson; import com.google.gson.annotations.SerializedName; public class JsonToObject2 { public static void main(String[] args) { String jsonString = "{\"NAME\":\"张三\",\"AGE\":18,\"GENDER\":\"男\"}"; Gson gson = new Gson(); Person2 person = gson.fromJson(jsonString, Person2.class); System.out.println(person); } } class Person2 { @SerializedName("NAME") private String name; @SerializedName("AGE") private Integer age; @SerializedName("GENDER") private String gender; // getters and setters @Override public String toString() { return "Person2{" + "name='" + name + '\'' + ", age=" + age + ", gender='" + gender + '\'' + '}'; } }
上述代码中,我们使用@SerializedName注解将Java对象中的属性名称和Json字符串中的属性名称进行了映射。
三、Json转Object对象 js
在前端开发中,我们通常会使用JavaScript来操作Json字符串。如果我们要将JavaScript对象转化为对应的Java对象,可以使用Java的ScriptEngine对象来执行JavaScript代码。示例代码如下:
import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; public class JsonToObject3 { public static void main(String[] args) throws ScriptException { String json = "{ \"name\":\"张三\", \"age\":18, \"gender\":\"男\" }"; ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript"); String script = "Java.asJSONCompatible(" + json + ")"; Object result = engine.eval(script); System.out.println(result); } }
上述代码中,我们使用ScriptEngine对象将Json字符串转化为了对应的Java对象。
四、Json转Object属性大小写
在Java中,属性名称是区分大小写的。如果Json字符串中的属性名称和Java对象中的属性名称大小写不一致,那么在转化为Java对象时会出现问题。可以使用GsonBuilder对象的setFieldNamingStrategy方法在转化时进行大小写的转换。示例代码如下:
import com.google.gson.FieldNamingStrategy; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.annotations.SerializedName; import java.lang.reflect.Field; public class JsonToObject4 { public static void main(String[] args) { String jsonString = "{\"Name\":\"张三\",\"Age\":18,\"Gender\":\"男\"}"; GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.setFieldNamingStrategy(new FieldNamingStrategy() { @Override public String translateName(Field field) { SerializedName annotation = field.getAnnotation(SerializedName.class); if (annotation != null) { return annotation.value(); } else { return field.getName().toLowerCase(); } } }); Gson gson = gsonBuilder.create(); Person3 person = gson.fromJson(jsonString, Person3.class); System.out.println(person); } } class Person3 { private String name; private Integer age; private String gender; // getters and setters @Override public String toString() { return "Person3{" + "name='" + name + '\'' + ", age=" + age + ", gender='" + gender + '\'' + '}'; } }
上述代码中,我们使用GsonBuilder对象设置了一个FieldNamingStrategy对象,该对象可以将属性名称转为小写。
五、Json转excel
有时候,我们需要将Json数据导出到Excel中。使用Apache POI库可以很方便地实现Json转Excel的功能。示例代码如下:
import com.google.gson.Gson; import org.apache.poi.hssf.usermodel.*; import java.io.FileOutputStream; import java.util.*; public class JsonToExcel { public static void main(String[] args) throws Exception { String jsonString = "[{\"name\":\"张三\",\"age\":18,\"gender\":\"男\"},{\"name\":\"李四\",\"age\":20,\"gender\":\"女\"}]"; Gson gson = new Gson(); Person4[] persons = gson.fromJson(jsonString, Person4[].class); HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("sheet1"); HSSFRow row0 = sheet.createRow(0); HSSFCell cell0 = row0.createCell(0); cell0.setCellValue("姓名"); HSSFCell cell1 = row0.createCell(1); cell1.setCellValue("年龄"); HSSFCell cell2 = row0.createCell(2); cell2.setCellValue("性别"); for (int i = 0; i < persons.length; i++) { HSSFRow row = sheet.createRow(i + 1); HSSFCell cell3 = row.createCell(0); cell3.setCellValue(persons[i].getName()); HSSFCell cell4 = row.createCell(1); cell4.setCellValue(persons[i].getAge()); HSSFCell cell5 = row.createCell(2); cell5.setCellValue(persons[i].getGender()); } FileOutputStream fos = new FileOutputStream("persons.xls"); workbook.write(fos); fos.close(); } } class Person4 { private String name; private Integer age; private String gender; // getters and setters }
上述代码中,我们使用Apache POI库创建了一个Excel文件,并将Json数据写入到Excel中。
六、Json转xml
有时候,我们需要将Json数据转化为XML格式。使用Jackson库可以很方便地实现Json转XML的功能。示例代码如下:
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.dataformat.xml.XmlMapper; import java.io.IOException; import java.util.*; public class JsonToXml { public static void main(String[] args) throws IOException { String jsonString = "{\"name\":\"张三\",\"age\":18,\"gender\":\"男\"}"; ObjectMapper objectMapper = new ObjectMapper(); SimpleModule xmlModule = new SimpleModule(); xmlModule.addSerializer(new CDATAJsonSerializer()); objectMapper.registerModule(xmlModule); objectMapper.enable(SerializationFeature.INDENT_OUTPUT); XmlMapper xmlMapper = new XmlMapper(); String xmlString = xmlMapper.writeValueAsString(objectMapper.readValue(jsonString, Object.class)); System.out.println(xmlString); } } class CDATAJsonSerializer extends com.fasterxml.jackson.databind.JsonSerializer{ @Override public void serialize(String value, com.fasterxml.jackson.core.JsonGenerator gen, com.fasterxml.jackson.databind.SerializerProvider serializers) throws IOException { gen.writeRaw(""); } }
上述代码中,我们使用XmlMapper将Jackson的ObjectMapper对象转化为XmlMapper对象。同样,我们也可以使用CDATAJsonSerializer类将Json数据中的特殊字符封装成CDATA形式输出到XML文件中。
七、Json转protobuf
Protocol Buffers是Google公司开发的一种轻量级的数据交换格式,使用它可以在不同的语言之间进行数据通信。Protobuf提供了一个.proto文件来定义数据类型,然后可以使用该文件生成对应的Java对象。示例代码如下:
syntax = "proto3"; message Person { string name = 1; int32 age = 2; string gender = 3; } import com.google.protobuf.InvalidProtocolBufferException; public class JsonToProtobuf { public static void main(String[] args) throws InvalidProtocolBufferException { String jsonString = "{\"name\":\"张三\",\"age\":18,\"gender\":\"男\"}"; PersonProto.Person.Builder personBuilder = PersonProto.Person.newBuilder(); PersonProto.Person person = personBuilder.mergeFrom(jsonString.getBytes()).build(); System.out.println(person); } }
上述代码中,我们使用Person.proto文件定义了Person数据类型,并使用该文件生成了一个Person.java对象。然后使用该对象的Builder类来将Json字符串转化为Person对象。
八、Json转换
在实际开发中,我们可能需要将Json数据从一个格式转化为另一个格式。以下是将Json转化为Properties格式的示例代码:
import com.google.gson.Gson; import java.util.Properties; public class JsonToProperties { public static void main(String[] args) { String jsonString = "{\"name\":\"张三\",\"age\":18,\"gender\":\"男\"}"; Gson gson = new Gson(); Properties properties = gson.fromJson(jsonString, Properties.class); System.out.println(properties); } }
上述代码中,我们将Json字符串转化为了Properties对象。
除此之外,还可以将Json转化为Yaml、Toml、INI等格式。