2

Android でのヒープ メモリ不足の問題を防ぐために、Jackson 内でツリー モデルからストリーミング API に変換しています。「タグ」値配列全体を JSON 文字列として読み取ることにより、処理をさらに高速化したいと考えています。この例では、レポート ID ごとに 3 つのタグすべてとその値を含む JSON 文字列が必要です。

私のデータの簡略版は次のとおりです。

    "TagRpts":[
   {  "ID":46,
      "Tags":[
         {  "Name":"Tag1",
            "Values":[
                {"t":"Instance 1","v":"407"},
                {"t":"Instance 2","v":"360"},
                {"t":"Instance 3","v":"309"}]},
         {  "Name":"Tag2",
            "Values":[
                {"t":"Instance 1","v":"926"},
                {"t":"Instance 2","v":"168"},
                {"t":"Instance 3","v":"366"}]},
         {  "Name":"Tag3",
            "Values":[
                {"t":"Instance 1","v":"744"},
                {"t":"Instance 2","v":"668"},
                {"t":"Instance 3","v":"62"}]}]},
   {  "ID":47,
      "Tags":[
         {  "Name":"machine 1",
            "Values":[
                {"t":"Instance 1","v":"613"},
                {"t":"Instance 2","v":"882"},
                "t":"Instance 3","v":"602"}]},
         {  "Name":"machine 2",
            "Values":[
                {"t":"Instance 1","v":"38"},
                {"t":"Instance 2","v":"38"},
                {"t":"Instance 3","v":"329"}]},
         {  "Name":"machine 3",
            "Values":[
                {"t":"Instance 1","v":"276"},
                {"t":"Instance 2","v":"721"},
                {"t":"Instance 3","v":"660"}]}]}
]

私は現在、このコードでそれを読んでいます(説明のために簡略化されています-コンマを処理する領域をstringbuilderに削除するなど):

if ("TagRpts".equals(fieldname)) { // TagRpts 
    jParser.nextToken(); // [ or null
    if (jParser.getText() != "null") {
        while (jParser.nextToken() != JsonToken.END_ARRAY) { // Tag report Array
            while (jParser.nextToken() != JsonToken.END_OBJECT) {
                fieldname = jParser.getCurrentName();

                if ("ID".equals(fieldname)) {
                    jParser.nextToken();
                    aTagReport.ID = jParser.getText();}

                if ("Tags".equals(fieldname)) {
                    StringBuilder sb = new StringBuilder();
                    sb.append("[");

                    while(jParser.nextToken() != JsonToken.END_ARRAY) {
                        fieldname = jParser.getCurrentName();

                        if ("Name".equals(fieldname)) {
                            jParser.nextToken();
                            sb.append("{\"Name\":\"" + Utility.encodeJSON(jParser.getText()) + "\"");}

                        if ("Values".equals(fieldname)) {
                            sb.append("\"Values\":[");

                            while(jParser.nextToken() != JsonToken.END_ARRAY) {
                                fieldname = jParser.getCurrentName();

                                if ("t".equals(fieldname)) {
                                    jParser.nextToken();
                                    sb.append("{\"t\":\"" + Utility.encodeJSON(jParser.getText()) + "\"");}

                                if ("v".equals(fieldname)) {
                                    jParser.nextToken();
                                    sb.append(",\"v\":\"" + Utility.encodeJSON(jParser.getText()) + "\"}");}
                            }
                            sb.append("]}");
                        } 
                    } 
                    sb.append("]");
                    aTagReport.Tags = sb.toString();
                } 
            } 
            aTagReport.SaveTagReport();
            aTagReport = new TagReport();
        }
    }
} 
4

1 に答える 1

0

JsonParser.readValueAsTree()サブツリーを読んでいるときに、サブツリーを読んでみませんか?そして、 を使用して JSON を再作成しますObjectMapper.writeValueAsString(rootNode)

于 2013-02-08T01:17:01.387 に答える