2

json文字列をJavaオブジェクトに解析しようとしています。現在、コードは手動でファイルを読み取り、Javaオブジェクトを生成しています。ただし、実装をgsonに移行することを検討しています。

Webサービスの呼び出しから受け取ったjsonは次のとおりです。

{ "comment": [
        "This file is used to define the behavior for the elements parsed.",
        "Each entry in the file will have the format of element:name, skip:bool",
        "If SkipFlag is true, it means that element need not be processed.",
        "Convention used for elements and rule names is camelCase"
    ],
    "rules": [ { "element": "html", "skip": true },
               { "element": "head", "skip": true },
               { "element": "head", "skip": true },
               { "element": "body", "skip": true }
    ]
}

コメントを無視してルールを変換する必要があります。ルールのJavaオブジェクトに対して定義しようとしているJavaタイプは次のとおりです。

// Arraylist < Map < elementname, Map < name, value >  > >
ArrayList< Map<String, Map<String, String>  > > rules;

gsonでこれを行う簡単な方法はありますか?

4

3 に答える 3

5

これを使って

GsonBuilder builder = new GsonBuilder();    
Gson gson = builder.enableComplexMapKeySerialization().create(); 
Type type = new TypeToken<ArrayList< Map<String, ArrayList<Map<String, String> > > >>() {}.getType();
ArrayList< Map<String, ArrayList<Map<String, String> > > > obj = gson.fromJson(str, type);
于 2013-03-16T17:14:48.930 に答える
3

特定のクラスを宣言できます。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

import com.google.gson.Gson;

class Rule {
   String  element;
   boolean skip;
}

class ElementParser {
   String[] comment;
   Rule[]   rules;
}

public class JSonDecoder {
   public static void main( String[] args ) throws IOException {
      try( BufferedReader reader =
              new BufferedReader( new FileReader( "Skip.json" ))) {
         System.out.println( 
            new Gson().fromJson( reader, ElementParser.class ).toString());
      }
   }
}

これが長いバージョンです:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

import com.google.gson.Gson;

class Rule {
   String element;
   boolean skip;

   @Override public String toString() {
      StringBuilder sb = new StringBuilder();
      sb.append( '\t' );
      sb.append( element );
      sb.append( " ==> " );
      sb.append( skip );
      sb.append( '\n' );
      return sb.toString();
   }   
}
class ElementParser {
   String[] comment;
   Rule[]    rules;

   @Override public String toString() {
      StringBuilder sb = new StringBuilder();
      sb.append( "Comment:\n" );
      for( String c : comment ) {
         sb.append( '\t' );
         sb.append( c );
         sb.append( '\n' );
      }
      sb.append( "Rules:\n" );
      for( Rule r : rules ) {
         sb.append( r.toString());
      }
      return sb.toString();
   }
}

public class JSonDecoder {
   public static void main( String[] args ) throws IOException {
      try( BufferedReader reader = new BufferedReader( new FileReader( "Skip.json" ))) {
         System.out.println( 
            new Gson().fromJson( reader, ElementParser.class ).toString());
      }
   }
}

結果:

Comment:
    This file is used to define the behavior for the elements parsed.
    Each entry in the file will have the format of element:name, skip:bool
    If SkipFlag is true, it means that element need not be processed.
    Convention used for elements and rule names is camelCase
Rules:
    html ==> true
    head ==> true
    head ==> true
    body ==> true
于 2013-03-16T17:27:36.167 に答える
1

あなたもこれを試すことができます。

ルールとコメントを保持するためのデータクラス

import java.util.List;

public class Data {

    private List<String> comments;
    private List<Rule> rules;

    public Data() {}

    public List<String> getComments() {
        return comments;
    }

    public void setComments(List<String> comments) {
        this.comments = comments;
    }

    public List<Rule> getRules() {
        return rules;
    }

    public void setRules(List<Rule> rules) {
        this.rules = rules;
    }

}

要素を保持し、パブリッククラスをスキップするためのRuleクラスRule {

    private String element;
    private boolean skip;

    public Rule() {}

    public String getElement() {
        return element;
    }

    public void setElement(String element) {
        this.element = element;
    }

    public boolean isSkip() {
        return skip;
    }

    public void setSkip(boolean skip) {
        this.skip = skip;
    }

}

最後に、jsonのルールをjavaに変換するために次のようなものを使用できます。

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.List;

import com.google.gson.Gson;

public class GsonTest {

    public static void main(String[] args) throws FileNotFoundException {
        BufferedReader bufferedReader = new BufferedReader(new FileReader("C:/Users/JESNAMOL/Desktop/json.txt"));//i have kept  your json string in a file for demonstration
        Gson gson = new Gson();
        Data data = gson.fromJson(bufferedReader, Data.class);
        List<Rule> rules = data.getRules();

        for (Rule rule : rules) {
            System.out.println("element: " + rule.getElement());
            System.out.println("skip: " + rule.isSkip());
        }
    }

}
于 2013-03-16T17:44:18.333 に答える