【问题标题】:how can i put json to map in java我如何将json映射到java中
【发布时间】:2020-01-16 07:57:06
【问题描述】:

在我的项目中,我有一个这样的 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,DMC,subTasks} 为此,我编写了这些代码

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.fasterxml.jackson.databind.exc.MismatchedInputException: 否 由于 [Source: (FileReader); 的输入结束而映射的内容;线:1, 列:0] 在 com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59) 在 com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:4344) 在 com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4189) 在 com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3218) 在 DocFinder.doGet(DocFinder.java:89) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:634) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:741) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) 在 org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) 在 org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367) 在 org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) 在 org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1598) 在 org.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(Unknown Source)

我不知道我需要做什么。我想使用这些参数来创建 servlet 重定向。

【问题讨论】:

  • 能否分享完整的堆栈跟踪和 json 文件数据
  • 看起来像您尝试解析 json 对象的文件,而实际上 json 是一个 json 数组。所以尝试使用Tasks 的列表/数组作为对象映射器
  • 您可能还需要适应您的儿子。可以通过在数组中只放置不带键的任务内容来简化它。

标签: java json jackson


【解决方案1】:

您需要创建适合JSON 有效负载的POJO 类。之后,将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}}]

【讨论】:

  • 我试过了,但我得到了这个错误。 java.lang.IllegalArgumentException:无法构造 DocFinder$Tasks 的实例(尽管至少存在一个 Creator):像这样的非静态内部类只能通过使用默认的无参数构造函数在 [来源:未知;行:-1,列:-1]
  • @mustafa53,将Tasks 类设为静态,并且它必须具有公共无参数构造函数。
【解决方案2】:

那一行的问题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>>(){});

【讨论】:

    【解决方案3】:
    "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;
        }
    }
    

    【讨论】:

    • 我仍然遇到同样的错误。在其他问题中,人们手动创建 json 文件,也许问题可能是这样的。
    • 不......你一定遇到了问题,因为我给出的例子是有一个名为“SUBTASK”的变量,而你的json包含“SUBTASK0”和“SUBTASK1”等等......你需要那些子任务对象中的变量
    • 我尝试调用其他变量,但它不起作用。 :(
    猜你喜欢
    • 2021-11-05
    • 1970-01-01
    • 2017-05-02
    • 2018-06-19
    • 2014-11-02
    • 1970-01-01
    • 2018-01-06
    • 2013-04-17
    • 1970-01-01
    相关资源
    最近更新 更多