как я могу поставить json на карту в java - PullRequest
0 голосов
/ 16 января 2020

В моем проекте у меня есть файл json, подобный этому.

  [
   {
      "Task": {
         "refType": "EM TASK ",
         "reference": "73-22-49-100-104",
         "engType": "A5",
         "DMC": "V2500-A0-73-22-4900-03A-251A-C",
         "subTasks": {
            "SUBTASK0": "73-22-49-110-054-001",
            "SUBTASK1": "73-22-49-110-054-002"
         }
      }
   }
]

Я хочу создать карту с этим файлом json. Это может быть так {refType, reference, engType, DM C, подзадачи} Для этого я написал эти коды

JSONParser parser = new JSONParser();
        int k=0;
        try {
            JSONObject json=null;
            System.out.println("Reading JSON file from Java program");
            FileReader fileReader = new FileReader("C:\\Users\\ftk1187\\Desktop\\jsonExample.json");
            JSONArray jsonArray = (JSONArray) parser.parse(fileReader);
            ArrayList<String> subtasks=new ArrayList<String>();
            for(int i=0;i<jsonArray.size();i++)
            {
                json=(JSONObject) jsonArray.get(i);
                JSONObject jsonValue = (JSONObject) json.get("Task");
                JSONObject subTasks = (JSONObject) jsonValue.get("subTasks");
                String reference = (String) jsonValue.get("reference");
                String refType = (String) jsonValue.get("refType");
                String engType = (String) jsonValue.get("engType");
                String dmc = (String) jsonValue.get("DMC");
                System.out.println("reference: " + reference);
                System.out.println("refType: " + refType);
                System.out.println("DMC: " + dmc);
                System.out.println("engType: " + engType);
                subtasks.addAll(subTasks.values());
                while(k<subtasks.size())
                {
                    System.out.println("SubTasks: "+subtasks.get(k));
                    k++;
                }
                ObjectMapper objectMapper=new ObjectMapper();
                Tasks map=objectMapper.readValue(fileReader, Tasks.class);
                System.out.println(map);
            }

class Tasks{
    private String engType;
    private String refType;
    private String reference;
    private String dmc;
    private String[] subTask;
    public String getEngType() {
        return engType;
    }
    public void setEngType(String engType) {
        this.engType=engType;
    }
    public String getRefType() {
        return refType;
    }
    public void setRefType(String RefType) {
        this.refType=RefType;
    }
    public String getReference() {
        return reference;
    }
    public void setReference(String Reference) {
        this.reference=Reference;
    }
    public String getDmc() {
        return dmc;
    }
    public void setDmc(String Dmc) {
        this.dmc=Dmc;
    }
    public String[] getSubTask() {
        return subTask;
    }
    public void setSubTask(String[] SubTask) {
        this.subTask=SubTask;
    }
    @Override
    public String toString() {
        StringBuilder sb=new StringBuilder();
        sb.append("{");
        sb.append(refType).append(",");
        sb.append(reference).append(",");
        sb.append(engType).append(",");
        sb.append(dmc).append(",");
        for(String subTask1:subTask) {
            sb.append(subTask1).append(",");
        }
        sb.append("}");
        return sb.toString();
    }
}

Но у меня это не работает. Это дает мне эту ошибку

com.faster xml .jackson.databind.ex c .MismatchedInputException: нет содержимого для сопоставления из-за конца ввода в [Source: (FileReader) ; строка: 1, столбец: 0] в com.faster xml .jackson.databind.ex c .MismatchedInputException.from (MismatchedInputException. java: 59) в com.faster xml .jackson.databind.ObjectMapper ._initForReading (ObjectMapper. java: 4344) в com.faster xml .jackson.databind.ObjectMapper._readMapAndClose (ObjectMapper. java: 4189) в com.faster xml .jackson.databind.ObjectMapper.readValue (ObjectMapper. java: 3218) в DocFinder.doGet (DocFinder. java: 89) в javax.servlet.http.HttpServlet.service (HttpServlet. java: 634) в javax.servlet.http.HttpServlet. служба (HttpServlet. java: 741) в орг. apache .catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain. java: 231) в орг. apache .catalina.core.ApplicationFilterChain .doil java: 166) в орг. apache .tomcat.websocket.server.WsFilter.doFilter (WsFilter. java: 53) в орг. apache .catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain. * 10) *: 193) в орг. apache .catalina.core.ApplicationFilterCha in.doFilter (ApplicationFilterChain. java: 166) на орг. apache .catalina.core.StandardWrapperValve.invoke (StandardWrapperValve. java: 202) на орг. StandardContextValve. java: 96) в орг. apache .catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase. java: 541) в орг. apache .catalina.core.StandardHostValve.invoke (StandardHostValve. *: 139) в орг. apache .catalina.valves.ErrorReportValve.invoke (ErrorReportValve. java: 92) в орг. apache .catalina.valves.AbstractAccessLogValve.invoke (AbstractAccessLogValve. java: 678) в орг. apache .catalina.core.StandardEngineValve.invoke (StandardEngineValve. java: 74) в орг. apache .catalina.connector.CoyoteAdapter.service (CoyoteAdapter. java: 343) в орг. apache .coyote.http11.Http11Processor.service (Http11Processor. java: 367) в орг. apache .coyote.AbstractProcessorLight.process (AbstractProcessorLight. java: 65) в орг. apache .coyote.Abstract $ ConnectionHandler.process (AbstractProtocol java:. 860 ) в орг. apache .tomcat.util. net .NioEndpoint $ SocketProcessor.doRun (NioEndpoint. java: 1598) в орг. apache .tomcat.util. net .SocketProcessorBase.run (SocketProcessorBase . java: 49) в java .util.concurrent.ThreadPoolExecutor.runWorker (неизвестный источник) в java .util.concurrent.ThreadPoolExecutor $ Worker.run (неизвестный источник) в org. apache .tomcat. util.threads.TaskThread $ WrappingRunnable.run (TaskThread. java: 61) в java .lang.Thread.run (Неизвестный источник)

Я не знаю, что мне нужно делать. Я хочу использовать эти параметры для создания перенаправления сервлета.

Ответы [ 3 ]

1 голос
/ 16 января 2020

Вам необходимо создать POJO класс, который соответствует JSON полезной нагрузке. После этого прочитайте JSON полезную нагрузку как дерево - как JSON Array. Выполните итерацию по нему и преобразуйте каждый Task узел в Tasks класс:

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class JsonApp {

    public static void main(String[] args) throws IOException {
        File jsonFile = new File("./src/main/resources/test.json");

        ObjectMapper mapper = JsonMapper.builder().build();

        List<Tasks> tasks = new ArrayList<>();
        ArrayNode array = (ArrayNode) mapper.readTree(jsonFile);
        array.forEach(item -> tasks.add(mapper.convertValue(item.get("Task"), Tasks.class)));

        System.out.println(tasks);
    }
}

class Tasks {
    private String engType;
    private String refType;
    private String reference;

    @JsonProperty("DMC")
    private String dmc;

    private Map<String, String> subTasks;

    // getters, setters, toString
}

Выше кода печатается:

[Tasks{engType='A5', refType='EM TASK ', reference='73-22-49-100-104', dmc='V2500-A0-73-22-4900-03A-251A-C', subTasks={SUBTASK0=73-22-49-110-054-001, SUBTASK1=73-22-49-110-054-002}}]
0 голосов
/ 16 января 2020

Проблема в этой строке Tasks map=objectMapper.readValue(fileReader, Tasks.class); Поскольку ваш json определяет список объектов, ваша модель определена для объекта.

Вы должны переопределить вашу модель следующим образом:

@Data // lombok
public class TaskWrapper {
    @JsonAlias("Task")
    private Task task;

    @Data
    public class Task {
        private String refType;
        private String reference;
        private String engType;
        @JsonAlias("DMC")
        private String dmc;
        private Map<String, String> subTasks;
    }
}

И измените эту строку на

List<TaskWrapper> tasks= t.readValue(fileReader, new TypeReference<List<TaskWrapper>>(){});
0 голосов
/ 16 января 2020
"subTasks": {
            "SUBTASK0": "73-22-49-110-054-001",
            "SUBTASK1": "73-22-49-110-054-002"
         }

Над кодом выглядит объект , в то время как он определен как private String [] subTask;

Использовать структуру ниже

==================================

public class SubTasks
{
    private String SUBTASK;

    public void setSUBTASK(String SUBTASK){
        this.SUBTASK = SUBTASK;
    }
    public String getSUBTASK(){
        return this.SUBTASK;
    }
}

==================================

public class Task
{
    private String refType;

    private String reference;

    private String engType;

    private String DMC;

    private SubTasks subTasks;

    public void setRefType(String refType){
        this.refType = refType;
    }
    public String getRefType(){
        return this.refType;
    }
    public void setReference(String reference){
        this.reference = reference;
    }
    public String getReference(){
        return this.reference;
    }
    public void setEngType(String engType){
        this.engType = engType;
    }
    public String getEngType(){
        return this.engType;
    }
    public void setDMC(String DMC){
        this.DMC = DMC;
    }
    public String getDMC(){
        return this.DMC;
    }
    public void setSubTasks(SubTasks subTasks){
        this.subTasks = subTasks;
    }
    public SubTasks getSubTasks(){
        return this.subTasks;
    }
}

==================================

public class Base
{
    private Task Task;

    public void setTask(Task Task){
        this.Task = Task;
    }
    public Task getTask(){
        return this.Task;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...