基于Java的Json结构化文件解析
我有一个Json结构化文件,它作为Json文件进行验证 我需要使用Java代码解析这个Json数据。我尝试了几个库,比如json.org和simple Jason,但是我无法从json文件错误中获得值,比如无效的s基于Java的Json结构化文件解析,java,json,Java,Json,我有一个Json结构化文件,它作为Json文件进行验证 我需要使用Java代码解析这个Json数据。我尝试了几个库,比如json.org和simple Jason,但是我无法从json文件错误中获得值,比如无效的s { "capacity": "30", "participants": { "858113": { "studentNum": "R1506D858113", "module_id": "300",
{
"capacity": "30",
"participants": {
"858113": {
"studentNum": "R1506D858113",
"module_id": "300",
"offer_id": "4254",
"grade": null,
"code": "WA"
},
"1007938": {
"studentNum": "R1509D1007938",
"module_id": "300",
"offer_id": "4254",
"grade": null,
"code": "WA"
},
"1022146": {
"studentNum": "R1509D1022146",
"module_id": "300",
"offer_id": "4254",
"grade": null,
"code": "WA"
},
"1041591": {
"studentNum": "R1510D1041591",
"module_id": "300",
"offer_id": "4254",
"grade": null,
"code": "WA"
},
"1226958": {
"studentNum": "R1601D1226958",
"module_id": "300",
"offer_id": "4254",
"grade": null,
"code": "WA"
}
}
}
这是Jason文件,下面是使用json.org的代码
final JSONObject obj = new JSONObject(JSON_DATA);
final JSONArray participants = obj.getJSONArray("participants");
final int n = participants.length();
for (int i = 0; i < n; ++i) {
final JSONObject person = participants.getJSONObject(i);
System.out.println(person.getInt("studentNum"));
}
final JSONObject obj=新的JSONObject(JSON_数据);
最终JSONArray参与者=obj.getJSONArray(“参与者”);
final int n=参与者。长度();
对于(int i=0;i
基本上,我需要以数组的形式检索这些信息。使用更健壮的OOP。使用像GSON这样的库将JSON转换为对象,然后进一步利用Java功能 主要目标:
public class ParticipantData
{
public String capacity;
public Map<String, Participant> participants;
}
公共课堂参与者数据
{
公共字符串容量;
公众地图参与者;
}
现在使用GSON将JSON转换为object并迭代:
Gson gson = new Gson();
Type dataType = (new TypeToken<ParticipantData>()
{
}).getType();
ParticipantData data = gson.fromJson(jsonData, dataType);
for(String e: data.participants.keySet()) {
System.out.printf("For participant with id %s, details are %s\n", e, data.participants.get(e));
}
Gson-Gson=new-Gson();
类型数据类型=(新类型令牌()
{
}).getType();
ParticipantData=gson.fromJson(jsonData,数据类型);
for(字符串e:data.participants.keySet()){
System.out.printf(“对于id为%s的参与者,详细信息为%s\n”,e,data.participants.get(e));
}
所以我用Jackson做了这个例子:
compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.9.9'
compile group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.9.9'
compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.9'
型号:
public class ParticipantData {
private String capacity;
private Map<String, Student> participants;
public String getCapacity() {
return capacity;
}
public Map<String, Student> getParticipants() {
return participants;
}
}
public class Student {
private String studentNum;
private String module_id;
private String offer_id;
private String grade;
private String code;
public String getStudentNum() {
return studentNum;
}
public String getModule_id() {
return module_id;
}
public String getOffer_id() {
return offer_id;
}
public String getGrade() {
return grade;
}
public String getCode() {
return code;
}
@Override
public String toString() {
return "Student{" +
"studentNum='" + studentNum + '\'' +
", module_id='" + module_id + '\'' +
", offer_id='" + offer_id + '\'' +
", grade='" + grade + '\'' +
", code='" + code + '\'' +
'}';
}
}
公共课堂参与者数据{
专用字符串容量;
私人地图参与者;
公共字符串getCapacity(){
返回能力;
}
公共地图获取参与者(){
返回参与者;
}
}
公立班学生{
私有字符串studentNum;
私有字符串模块\u id;
私有字符串提供\u id;
私家弦级;
私有字符串码;
公共字符串getStudentNum(){
返回studentNum;
}
公共字符串getModule_id(){
返回模块标识;
}
公共字符串getOffer_id(){
返回报价单;
}
公共字符串getGrade(){
返回等级;
}
公共字符串getCode(){
返回码;
}
@凌驾
公共字符串toString(){
返回“学生{”+
“studentNum=”+studentNum+“\”+
“,模块id=”+“模块id+”\”+
“,offer\u id=”“+offer\u id+”\”+
“,年级=”+年级+“\”+
“,代码=”“+code+”\“””+
'}';
}
}
这里是使用ObjectMapper的解析器类:
import com.fasterxml.jackson.databind.ObjectMapper;
import model.ParticipantData;
import java.io.IOException;
import java.util.Optional;
public class MyJsonReader {
private static Optional<ParticipantData> read(String jsonToParse) {
try {
return Optional.of(new ObjectMapper().readValue(jsonToParse, ParticipantData.class));
} catch (IOException e) {
e.printStackTrace();
return Optional.empty();
}
}
public static void main(String[] args) {
String jsonToParse = getYourJsonToParseAsString();
read(jsonToParse).ifPresent(participantData -> {
System.out.println(participantData.getCapacity());
participantData.getParticipants().forEach((key, value) -> {
System.out.println(key);
System.out.println(value);
});
});
}
}
import com.fasterxml.jackson.databind.ObjectMapper;
导入model.ParticipantData;
导入java.io.IOException;
导入java.util.Optional;
公共类MyJsonReader{
私有静态可选读取(字符串jsonToParse){
试一试{
返回可选的.of(new ObjectMapper().readValue(jsonToParse,ParticipantData.class));
}捕获(IOE异常){
e、 printStackTrace();
返回可选的.empty();
}
}
公共静态void main(字符串[]args){
字符串jsonToParse=getYourJsonToParseAsString();
读取(jsonToParse).ifPresent(participantData->{
System.out.println(participantData.getCapacity());
participantData.getParticipants().forEach((键,值)->{
系统输出打印项次(键);
系统输出打印项次(值);
});
});
}
}
在本例中,它将遍历所有参与者并将其打印出来。您可以使用Jackson。它很简单,可以处理返回带有键值的映射的所有逻辑
Map<String, Object> jsonMap = new ObjectMapper().readValue(stringResponseBody, new TypeReference<Map<String, Object>>() {});
Map jsonMap=newObjectMapper().readValue(stringResponseBody,newTypeReference(){});
使用org.json更改代码
JSONObject jsonObj=新的JSONObject(JSON_数据);
//这里的参与者是jsonObject,而不是jsonArray
JSONObject参与者=jsonObj.getJSONObject(“参与者”);
//这个jsonObject参与者有五个键值对。
//因此,遍历键并获取值(这些值也是另一个值)
//jsonObject)
迭代器键=参与者。键();
while(key.hasNext()){
JSONObject person=participants.getJSONObject(key.next());
//key studentNum的值为字符串类型
System.out.println(person.getString(“studentNum”);
}
为什么要标记mysql和sql server?这个jason是从mysql数据库中检索的它是JSON(JavaScript对象表示法),而不是jason(Argonauts的领导者)。另外,如果您使用的是MySQL,那么为什么要标记MicrosoftSQLServer呢?请只标记您实际使用的RDBMS。这里的参与者是jsonObject,而不是jsonArrayHi@georgeorgiou,添加了反映您的模型以及如何将表单字符串获取到您想要的JSON对象的答案。
Map<String, Object> jsonMap = new ObjectMapper().readValue(stringResponseBody, new TypeReference<Map<String, Object>>() {});