基于Java的Json结构化文件解析

基于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",

我有一个Json结构化文件,它作为Json文件进行验证

我需要使用Java代码解析这个Json数据。我尝试了几个库,比如json.org和simple Jason,但是我无法从json文件错误中获得值,比如无效的s

{
    "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>>() {});