2012-02-22 2 views
0

이 답변을 발견했으며 적용 할 수 있다고 생각합니다. JSON 파일로 저장된 다른 객체를 반환하는 재귀 메서드

How to return multiple objects from a Java method?

나는 장치의 목록은 하나의 YML 부분 집합을 사용하여 두 JSON 형식의 파일을, 다른 하나는 장치의 특정 유형의 속성을 나열하는 파일입니다.

Device 인스턴스 목록을 하나의 파일과 다른 파일의 속성으로 나누는 선택은 장치 제조업체가 돌아가서 하드 코딩 된 특성을 다시 작성/다시 컴파일하지 않고 특성을 변경할 수있게하는 것입니다.

어쨌든 두 가지 JSONParser 호출을 사용하여 끝에있는 Device 객체에 속성 목록을 추가 할 수 있지만 그 해결책은 코드의 낭비처럼 보입니다. 값을 설정하는 루프는 똑같은 일을합니다.

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; 
} 

}

+0

또한 루프의 내부 부분을 익명 함수로 전달하거나 아마도 Decorator 패턴을 사용하여 LoadJSON에 함수를 추가 할 수 있습니다. – bentaisan

+0

두 파일의 구조가 완전히 같습니까? –

+0

아니요, 두 파일의 구조가 다릅니다. 장치의 마스터 목록이 있으며 각 장치에는 유형이 있습니다. 속성을 포함하는 각 유형에 대해 하나의 유형 파일이 있습니다. – bentaisan

답변

1

확인 당신이 두 개의 파일, 장치의 목록과 다른 장치 별 파일 하나를 가지고 있으므로, 장치의 속성을 가지고 있습니다.

{{"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을 만들 process . openJSON은이 유형의 매개 변수를 사용하고 각 메소드에 대해 process을 호출합니다.

myDevice을 처리하고 필드를 설정하여 장치 수준 처리기를 구성 할 수 있습니다.

관련 문제