2012-02-22 39 views
0

この回答が見つかりました。JSONファイルとして保存された別のオブジェクトを返す再帰的メソッド

How to return multiple objects from a Java method?

私は、デバイスのリストであるそのうちの一つYMLのサブセットを使用して、2つのJSON形式のファイルを、持っている、と他のデバイスの特定の種類の属性をリストするファイルです。

Deviceインスタンスのリストを1つのファイルと別のファイルの属性に分割するかどうかは、デバイスの製造元がハードコーディングされた属性を元に戻したり再コンパイルしなくても属性を変更できるようにすることです。

いずれにしても、JSONParserを2回呼び出すと、最後に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

また、おそらくループの内側部分を無名関数として渡すこともできますし、おそらくデコレータパターンを使って関数をLoadJSONに追加することもできます。 – bentaisan

+0

2つのファイルは全く同じ構造をしていますか? –

+0

いいえ、2つのファイルの構造が異なります。デバイスのマスターリストがあり、各デバイスにはタイプがあります。属性を含む各タイプの1つのタイプファイルがあります。 – bentaisan

答えて

1

[OK]を使用すると、2つのファイル、デバイスの一覧およびその他の、デバイスごとのファイルのものを持っているので、デバイスの属性を持っています。そこにデバイスごとのファイルで

{{"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を読み取り、リストの各エントリに対してマップを処理することです。

マップを処理するロジックは、2つの唯一の違いです。今、あなたがコールバックを使用しているこれを行うにはmyDevice

一つの方法でどこかに保存する必要がありますデバイスごとのファイルから読んだもの破棄されることに注意してください:メソッドを持つインターフェイスMapHandlerを作成processopenJSONはこのタイプのパラメータを取り、メソッドごとにprocessを呼び出します。

デバイスレベルのハンドラは、myDeviceが処理され、フィールドが設定された状態で構築できます。

関連する問題