이 답변을 발견했으며 적용 할 수 있다고 생각합니다. 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;
}
}
또한 루프의 내부 부분을 익명 함수로 전달하거나 아마도 Decorator 패턴을 사용하여 LoadJSON에 함수를 추가 할 수 있습니다. – bentaisan
두 파일의 구조가 완전히 같습니까? –
아니요, 두 파일의 구조가 다릅니다. 장치의 마스터 목록이 있으며 각 장치에는 유형이 있습니다. 속성을 포함하는 각 유형에 대해 하나의 유형 파일이 있습니다. – bentaisan