4

複雑な要素のセットが多数含まれているサンプルのJsonファイルを再帰的に解析しようとしています。そして私が試しているコードはこれです:

public class Jsonex {
    public static void main(String argv[]) {
        try {
            Jsonex jsonExample = new Jsonex();
           jsonExample.testJackson();
        } catch (Exception e){
            System.out.println("Exception " + e);
        }       
    }
    public static void testJackson() throws IOException {       
        JsonFactory factory = new JsonFactory();
       // System.out.println("hello");
        ObjectMapper mapper = new ObjectMapper(factory);
        File from = new File("D://albumList.txt");
        TypeReference<HashMap<String,Object>> typeRef = new TypeReference<HashMap<String,Object>>() {};
        HashMap<String,Object> o= mapper.readValue(from, typeRef);
       // System.out.println("" + o);
        Iterator it = o.entrySet().iterator();
       while (it.hasNext()) {

          Map.Entry pairs = (Map.Entry)it.next();
            System.out.println(pairs.getKey() + " = " + pairs.getValue());

           HashMap<String,Object> o1=mapper.readValue(pairs.getValue().toString(),typeRef);
          System.out.println("hey"+o1);
           Iterator it1 = o1.entrySet().iterator();
           while (it1.hasNext()) {
                Map.Entry pairs1 = (Map.Entry)it.next();
                System.out.println(pairs1.getKey() + " = " + pairs1.getValue());
            it1.remove(); // avoids a ConcurrentModificat



    }   
    }
}}

そして私はこの例外を受け取ります:

例外org.codehaus.jackson.JsonParseException:予期しない文字('i'(コード105)):[ソース:java.io.StringReader@2de7753a;でフィールド名を開始するために二重引用符が必要でした。行:1、列:3]

実際に私がやろうとしているのは、ファイルを解析して名前オブジェクトのペアのリストを取得し、名前とオブジェクトのペアを持つオブジェクトを取得することです。-しかし、問題は、パーサーが文字列の前に「」を期待していることです。

4

2 に答える 2

5

すべてを自分で解析する代わりに、Jacksonsの組み込みツリーモデル機能(http://wiki.fasterxml.com/JacksonTreeModel)の使用を検討する必要があります。

ObjectMapper mapper = new ObjectMapper(factory);
File from = new File("D://albumList.txt");
JsonNode rootNode = mapper.readTree(from);  

Iterator<Map.Entry<String,JsonNode>> fields = rootNode.fields();
while (fields.hasNext()) {

    Map.Entry<String,JsonNode> field = fields.next();
    System.out.println(field.getKey() + " = " + field.getValue());
    …

}

これは長期的にはより便利なはずです。http://fasterxml.github.com/jackson-databind/javadoc/2.1.0/com/fasterxml/jackson/databind/JsonNode.htmlでAPIを確認してください。

于 2013-03-18T18:46:12.273 に答える
4

ただのコメント。ご存知のように、Jackson がサポートする主要な処理モードは 3 つあります (データ バインディング、ストリーミング API、およびツリー モデル)。公式ドキュメントによると、ツリーモデルを使用することにした場合、メモリ使用量はマップされたコンテンツに比例することを考慮する必要があります (データバインディングと同様)。マッピングは一度にチャンクで行われます。これは、データ バインディングで発生する問題と同じです。代わりに Stream-of-Events を使用することで解決できる場合もあります。

于 2014-04-29T09:21:22.340 に答える