当前位置: 首页 > 面试题库 >

递归方法以返回存储为JSON文件的不同对象

邰建业
2023-03-14
问题内容

我有两个使用YML子​​集的JSON格式的文件,其中一个是设备列表,另一个是列出特定类型设备属性的文件。

将设备实例列表分为一个文件,将属性分为另一个文件的选择是为了使设备制造商可以更改属性,而不必返回并重新编写/重新编译硬编码属性。

无论如何,我可以对JSONParser使用两个不同的调用,然后最后将属性列表添加到Device对象,但是这种解决方案似乎浪费了代码,因为while循环的内部除外,设置了值,它们做的完全相同。

我以为像Ruby-ish Yield之类的方法可能会在内部循环中解决问题,但不确定Java中是否存在这种方法。

因此,事不宜迟,这里是代码:

// Import the json simple parser, used to read configuration files
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
import org.json.simple.parser.*;

public  class LoadJson {

    private String path = "";
    private String fileType = "";

    //public LoadJson(String path, String fileType){

        //this.path = path;
        //this.fileType = fileType;

    //}

    public static Device openJSON(String fileType, String deviceName) {
        JSONParser parser = new JSONParser();
        Device myDevice = new Device();

        ContainerFactory containerFactory = new ContainerFactory(){
            public List creatArrayContainer() {
              return new LinkedList();
            }

        public Map createObjectContainer() {
          return new LinkedHashMap();
        }

      };

      try {
            File appBase = new File("."); //current directory
            String path = appBase.getAbsolutePath();
            System.out.println(path);

            Map obj = (Map)parser.parse(new FileReader(path+fileType),containerFactory);

            Iterator iter = obj.entrySet().iterator();

            //Iterator iterInner = new Iterator();

            while(iter.hasNext()){
                //LinkedList entry = (LinkedList)iter.next();
                LinkedList myList = new LinkedList(); 
                Map.Entry entry = (Map.Entry)iter.next();

                myList = (LinkedList) (entry.getValue());

                Iterator iterate = myList.iterator();
                while (iterate.hasNext())
                {
                    LinkedHashMap entry2 = (LinkedHashMap)iterate.next();
                    if(fileType=="mav2opc")
                            {
                             String deviceName1 = entry2.get("DeviceName").toString();
                             String userName = entry2.get("UserName").toString();
                             String password = entry2.get("Password").toString();
                             String deviceType = entry2.get("DeviceType").toString();
                             String ipAddress = entry2.get("IPAddress").toString();
                             myDevice = new Device(deviceName1, userName, password, deviceType,ipAddress);
                             openJSON(deviceType,deviceName1);
                             System.out.println(myDevice);
                            } else
                            {
                                //Add a tag
                                String tagName = entry2.get("tagName").toString();
                                String tagType = entry2.get("tagType").toString();
                                String tagXPath = entry2.get("tagXPath").toString();
                                String tagWritable = entry2.get("tagWritable").toString();
                            }

                }
            }

            //System.out.println("==toJSONString()==");
            //System.out.println(JSONValue.toJSONString(json));

      } catch (FileNotFoundException e) {
            e.printStackTrace();
      } catch (IOException e) {
            e.printStackTrace();
      } catch(ParseException pe){
            System.out.println(pe);
    }
      return myDevice;
}

}


问题答案:

好的,所以您有两个文件,一个包含设备列表,另一个包含每个设备的文件,每个文件都具有设备属性。这两个文件的结构完全相同,我猜是这样的

设备文件:

{{"DeviceName:"d1","UserName":"u1","Password":"p1","DeviceType":"t1","IPAddress":"i1"},
 {"DeviceName:"d2","UserName":"u2","Password":"p2","DeviceType":"t2","IPAddress":"ir"}}

和每个设备的文件

{{"tagName:"n1","tagType":"t1","tagXPath":"X1","tagWritable":true}}

每个设备文件中只有一个映射,尽管它在列表中。处理逻辑是打开文件,创建解析器,读取json并为列表中的每个条目处理地图。

处理地图的逻辑是两者之间的唯一区别。请注意,现在您正在丢弃从每个设备文件中读取的内容,您必须将其存储在myDevice

一种实现方法是使用回调:创建一个MapHandler具有method
的接口processopenJSON接受此类型的参数并process为每个方法调用它。

可以使用myDevice正在处理的设备级处理程序来构造并设置字段。



 类似资料:
  • 问题内容: 我正在尝试使用Java中的递归创建Palindrome程序,但是我被困住了,这是我到目前为止所拥有的: 谁能提供解决我问题的方法? 问题答案: 在这里,我为您粘贴代码: 但是,我强烈建议您了解其工作原理, 从您的问题出发,您是完全不可读的。 尝试理解此代码。 阅读代码中的注释

  • 问题内容: 我有一个像这样的递归函数 我正在使用它 我注意到您好永远不会返回,因为我怀疑我在递归调用上创建了多个promise,但是我不确定如何从中返回。 如何返回每个递归创建的Promise? 编辑: 结果是 问题答案: 递归是一种功能性遗产,因此将其与功能性样式一起使用可产生最佳效果。这意味着编写接受和操作其输入(而不是依赖于外部状态)和返回值(而不是依赖于突变或副作用)的函数。 你的程序,而

  • 我的业务规则是,如果第一个、最后一个和中间字段都相等,或者如果第一个和最后一个字段相等,并且其中一个(或两个)对象的中间字段为null,则两个Name对象被视为相等。 因此,在为我的Name类实现hash和equals方法时,我可以使用这样的用例:equals为两个对象返回true,但这两个对象的hash返回不同的值(因为一个对象的middle值为null值,而另一个对象的middle值为null

  • 我现在正在学习Java,有一个任务,我应该创建一个方法,在输入两个关键字中的一个之前,一直要求用户输入。然后,它应该返回一个int。

  • 我正在研究一个简单的递归方法,在Ruby中实现Euclid的算法,并发现自己在弄清楚一旦达到基本情况后如何返回所需的值。以下是我必须了解的内容: 并且输出: 注意,“puts euclid_alg(100,15)”没有输出,我希望返回100和15,5的最大公约数。 为了进行故障排除,我将第3行中的替换为。新的产出是: 将“make it here 5 10”添加到控制台输出中,可以清楚地表明 re

  • 我正在尝试创建一个递归函数,该函数将生成项的嵌套结构。此文件中的每个项都有一个指向其子项的指针和一个停止值,如您可以在下面看到的: 这个递归函数应该获得一个开始索引,它将根据该索引构建树,并返回一个嵌套的字典,如下所示: