2016-05-31 17 views
1

私は下記のjsonを解析しようとしています。JSONファイルを解析する

{ 
    "sections": [ 
    { 
     "title": "Title android", 
     "level": 1, 
     "content": [ 
     { 
      "type": "paragraph", 
      "text": "This is paragraph 1 for android." 
     } 
     { 
      "type": "paragraph", 
      "text": "This is paragraph 2 for android" 
     } 
     ], 
     "images": [ 
     { 
      "src": "http://image1 android.", 
      "caption": "Image 1." 
     }, 
     { 
      "src": "http://image2 android", 
      "caption": "Image 2." 
     } 
     ] 
    }, 
    { 
     "title": "Title java", 
     "level": 2, 
     "content": [ 
     { 
      "type": "paragraph", 
      "text": "This is paragraph 1 for Java." 
     }, 
     { 
      "type": "paragraph", 
      "text": "This is paragraph 2 for Java" 
     } 
     ], 
     "images": [ 
     { 
      "src": "http://image1 java.", 
      "caption": "Image 1." 
     }, 
     { 
      "src": "http://image2 java", 
      "caption": "Image 2." 
     } 
     ] 
    }, 
    { 
     "title": "Title json", 
     "level": 3, 
     "content": [ 
     { 
      "type": "paragraph", 
      "text": "This is paragraph 1 for Json." 
     }, 
     { 
      "type": "paragraph", 
      "text": "This is paragraph 2 for Json" 
     }, 
     { 
      "type": "paragraph", 
      "text": "This is paragraph 3 for Json" 
     } 
     ], 
     "images": [ 
     { 
      "src": "http://image1 Json.", 
      "caption": "Image 1." 
     }, 
     { 
      "src": "http://image2 Json", 
      "caption": "Image 2." 
     } 
     ] 
    } 

は、私はそうで

Title 1 :Title android. \n 
Content 1:This is paragraph 1 for android. 
     This is paragraph 2 for android. 
Image 1:http:// image1 android. 
Image 2:http:// image2 android. 

Title :Title Java. 
Content:This is paragraph 1 for Java. 
     This is paragraph 2 for Java. 
Image 1:http:// image1 Java. 
Image 2:http:// image2 Java. 

として出力するこれらのJSONをしたい...と。私は上記のコードは完全ではありません、これまで

public class ParseJSON { 
    public static String[] titles; 
    public static String[] contents; 
    public static String[] levels; 

    public static final String JSON_ARRAY = "sections"; 
    public static final String TITLE = "title"; 
    public static final String CONTENT = "content"; 
    public static final String TEXT = "text"; 

    private JSONArray sections = null; 
    private JSONArray content = null; 

    private String json; 

    public ParseJSON(String json) { 
     this.json = json; 
    } 

    protected void parseJSON() { 
     JSONObject jsonObject ; 
     try { 
      jsonObject = new JSONObject(json); 
      sections = jsonObject.getJSONArray(JSON_ARRAY); 

      titles = new String[sections.length()]; 
      levels = new String[sections.length()]; 

      for (int i = 0; i < sections.length(); i++) { 
       titles[i] = sections.getJSONObject(i).getString(TITLE); 

       JSONArray content = sections.getJSONObject(i).getJSONArray(CONTENT); 
       contents = new String[content.length()]; 
       Log.d("MainActivity",contents.toString()); 
       for (int j = 0; j < content.length(); j++) { 

        contents[j] += content.getJSONObject(j).getString(TEXT).toString() + "\n\n"; 
        //Log.d("MainActivity",contents.toString()); 
       } 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

を行っている何

。 私は上記のようにjsonを印刷したいと思います。 しかし、私は必要に応じてタイトルパートと段落パートを取得していません。

コンテンツの配列からTEXTを解析すると、jsonからcontent [0]、content [1]などのすべての段落が結合されます。 タイトルのみのコンテンツをご希望の場合

リンク部分には何らかの役割があると思いますが、どうすればいいのか分かりません。私は真ん中の1 alone.ieとして出力したい場合は、

//android title part //not needed 
//The part needed is below one: 
Title :Title Java. 
Content:This is paragraph 1 for Java. 
     This is paragraph 2 for Java. 
Image 1:http:// image1 Java. 
Image 2:http:// image2 Java. 

//json title part //not needed 
+0

タイトル、コンテンツ、画像を別々の配列ではなく1つのオブジェクトの下にまとめるJavaクラスの作成を強く検討する。代わりに、オブジェクト型の配列を使用します。 –

+0

私はGsonについて誰も言及していないことに驚いていますか? – Eenvincible

+0

@Engvincibleは、同じ質問に対してgsonを使って簡単な例を挙げてくれますか?ありがとうございました –

答えて

1

thisのようなjson converter to pojoツールを使用すると、json結果を簡単に操作するために使用できるPlain Old Java Objects(POJO)を生成できます。あなたのJSON文字列から

、私は次のJavaクラスを生成することができた。そして、これはイメージ・エンティティを表し

public class Content { 

    @SerializedName("type") 
    @Expose 
    private String type; 
    @SerializedName("text") 
    @Expose 
    private String text; 

    /** 
    * 
    * @return 
    * The type 
    */ 
    public String getType() { 
     return type; 
    } 

    /** 
    * 
    * @param type 
    * The type 
    */ 
    public void setType(String type) { 
     this.type = type; 
    } 

    /** 
    * 
    * @return 
    * The text 
    */ 
    public String getText() { 
     return text; 
    } 

    /** 
    * 
    * @param text 
    * The text 
    */ 
    public void setText(String text) { 
     this.text = text; 
    } 

} 

を:

public class Image { 

    @SerializedName("src") 
    @Expose 
    private String src; 
    @SerializedName("caption") 
    @Expose 
    private String caption; 

    /** 
    * 
    * @return 
    * The src 
    */ 
    public String getSrc() { 
     return src; 
    } 

    /** 
    * 
    * @param src 
    * The src 
    */ 
    public void setSrc(String src) { 
     this.src = src; 
    } 

    /** 
    * 
    * @return 
    * The caption 
    */ 
    public String getCaption() { 
     return caption; 
    } 

    /** 
    * 
    * @param caption 
    * The caption 
    */ 
    public void setCaption(String caption) { 
     this.caption = caption; 
    } 

} 

これは、ように2つのオブジェクトを含む傘ですリスト:

public class Section { 

    @SerializedName("title") 
    @Expose 
    private String title; 
    @SerializedName("level") 
    @Expose 
    private int level; 
    @SerializedName("content") 
    @Expose 
    private List<Content> content = new ArrayList<Content>(); 
    @SerializedName("images") 
    @Expose 
    private List<Image> images = new ArrayList<Image>(); 

    /** 
    * 
    * @return 
    * The title 
    */ 
    public String getTitle() { 
     return title; 
    } 

    /** 
    * 
    * @param title 
    * The title 
    */ 
    public void setTitle(String title) { 
     this.title = title; 
    } 

    /** 
    * 
    * @return 
    * The level 
    */ 
    public int getLevel() { 
     return level; 
    } 

    /** 
    * 
    * @param level 
    * The level 
    */ 
    public void setLevel(int level) { 
     this.level = level; 
    } 

    /** 
    * 
    * @return 
    * The content 
    */ 
    public List<Content> getContent() { 
     return content; 
    } 

    /** 
    * 
    * @param content 
    * The content 
    */ 
    public void setContent(List<Content> content) { 
     this.content = content; 
    } 

    /** 
    * 
    * @return 
    * The images 
    */ 
    public List<Image> getImages() { 
     return images; 
    } 

    /** 
    * 
    * @param images 
    * The images 
    */ 
    public void setImages(List<Image> images) { 
     this.images = images; 
    } 

} 

他のものと同様に生成して保存した後クラスでは、Gsonを使用してjson Stringをプロパティを持つこれらのオブジェクトに変換できます。あなたはJSONレスポンスのセクションのListを取得しているので

は、何を行うことができますすることは簡単です:

List<Section> sections = new Gson().fromJson(jsonString, Section.class); 

は今、あなたはあなたを介してループは画像やコンテンツを取得することができますセクションのリストを持っています。コンテンツは、イメージがそうであるように、独自のリストを持っていることを忘れないでください。それで、あなたは簡単にあなたのデータを得ることができるはずです。

私はこれがあなたを助けてくれることを願っています。

Gradleを使用してGsonを追加したり、jarファイルをダウンロードしてandroid studioの/libsフォルダに追加することができます。

2

は、なぜあなたは手動でJSONを解析することによって自分自身を拷問何

UPDATE ?軽量なJSON Parserを使用することをお勧めします。あなたのケースでは

package yourpackage; 

import java.io.IOException; 
import java.io.StringWriter; 
import java.util.List; 

import org.codehaus.jackson.JsonGenerationException; 
import org.codehaus.jackson.JsonParseException; 
import org.codehaus.jackson.map.JsonMappingException; 
import org.codehaus.jackson.map.ObjectMapper; 

public class JsonMapper 
{ 
    private static ObjectMapper objectMapper = new ObjectMapper(); 

    public static Object fromJsonToJavaObject(String jsonObject, Class<?> clazz) throws JsonParseException, JsonMappingException, IOException 
    { 
     return objectMapper.readValue(jsonObject, clazz); 
    } 

    public static String fromJavaObjectToJson(Object javaObject) throws JsonGenerationException, JsonMappingException, IOException 
    { 
     StringWriter stringWriter = new StringWriter(); 

     objectMapper.writeValue(stringWriter, javaObject); 

     return stringWriter.toString(); 
    } 

    public static List<?> fromJsonToJavaObjects(String jsonObject, Class<?> clazz) throws JsonParseException, JsonMappingException, IOException 
    { 
     return objectMapper.readValue(jsonObject, objectMapper.getTypeFactory().constructCollectionType(List.class, clazz)); 
    } 
} 

、ちょうどTitleWithImages.classのような第一の方法にJSON文字列と期待される結果の型を渡す:これは私がorg.codehaus.jacksonマッパーとAndroidの中でそれを行う方法です。 これは、Mavenの依存関係になります(ただし、Androidのスタジオを使用している):

<dependency> 
    <groupId>org.codehaus.jackson</groupId> 
    <artifactId>jackson-mapper-asl</artifactId> 
    <version>1.9.13</version> 
</dependency> 
+0

Gsonを使用して解析しているときに、Androidでメモリ不足の問題が発生していたことがありますが、同じタスクを実行するにはかなり時間がかかります( –

+0

@ cricket_007)。多くのデータそしてなぜそれが私の提案よりも 'objectMapper.readValue(jsonObject、clazz);'? – Bevor

+0

オブジェクトマッパーを定義することはもう一つのコード行です:)私はジャクソンを使っていましたが、なぜGsonに切り替えたのかよく分かりません。 –

3
try { 
     JSONObject jsonObject = new JSONObject(data); 
     sections = jsonObject.getJSONArray("sections"); 
     for (int i = 0; i < sections.length(); i++) { 
      JSONObject contentJSON = sections.getJSONObject(i); 
      Log.d("", "Title: "+ contentJSON.getString("level") + " " + contentJSON.getString("title")); 
      JSONArray contentArray = contentJSON.getJSONArray("content"); 
      Log.d("","Content: " + contentJSON.getString("level") + " " ); 
      for (int j = 0; j < contentArray.length(); j++) { 
       Log.d("",contentArray.getJSONObject(i).getString("text")); 
      } 
      JSONArray imageArray = contentJSON.getJSONArray("images"); 
      Log.d("","Images: " + contentJSON.getString("level") + " " ); 
      for (int j = 0; j < imageArray.length(); j++) { 
       Log.d("",imageArray.getJSONObject(j).getString("src")); 
      } 
     } 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

私はあなただけの文字列配列にそれを追加したり、より良いあなたが

を必要とするパラメータを持つオブジェクトを作成することができますLogcatの出力を印刷しています
+0

私は別の出力の質問を変更しました。 上記の回答は機能しています。しかし、私はこの特定の変更が行われたことを思い出しました。 あなたもその答えを働かせることができますか? –

+0

あなたが解析したいセクションのタイトルを比較するだけです。一致する場合は残りのものを解析して保存します。 'if(contentJSON.getString(" title ")。equals(" Title Java "))' 次に構文解析を行い、ループを続行します –