2016-09-21 3 views
0

たとえば、私のJSONテキストは次のようになります。乱数生成でのJSONテキストからJavaへの変換の問題

"pages":{"42010":{"pageid":42010,"ns":0,"title":"Queen (band)"}} 

私のjsonテキストは、ページタグ内に異なる番号が付いてくるたびに発生します。

これをJava同等のクラスに変換するにはどうすればよいですか?

現在、私の生成するJavaクラスは、このようなものです。私は、pagesの内側に毎回新しい番号を取得していては動作していないので、_42010クラスは、"pageid":42010,"ns":0,"title":"Queen (band)"のような内部フィールドが含まれていることを

@Generated("org.jsonschema2pojo") 
public class Pages { 

    @SerializedName("42010") 
    @Expose 
    private _42010 _42010; 
} 

。その特定のjsonテキストのためだけに働いています。

答えて

1

を言うことができます。たとえば、次のタイプのページの

package jacksonTest; 

import java.io.IOException; 
import java.lang.reflect.Type; 

import com.fasterxml.jackson.core.JsonParseException; 
import com.fasterxml.jackson.databind.JsonMappingException; 
import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 
import com.google.gson.JsonDeserializationContext; 
import com.google.gson.JsonDeserializer; 
import com.google.gson.JsonElement; 
import com.google.gson.JsonObject; 

public class CustomDeserialiser { 


public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException { 
    String json = "{\"42010\":{\"pageid\":42010,\"ns\":0,\"title\":\"Queen (band)\"}}"; 
    String json2 = "{\"12345\":{\"pageid\":12345,\"ns\":0,\"title\":\"Queen (band)\"}}"; 

    Gson g = new GsonBuilder().registerTypeAdapter(Pages.class, new PagesDeserialiser()).create(); 

    Pages fromJson = g.fromJson(json, Pages.class); 
    System.out.println(fromJson); 

    fromJson = g.fromJson(json2, Pages.class); 
    System.out.println(fromJson); 
} 

public static class PagesDeserialiser implements JsonDeserializer<Pages> { 

    @Override 
    public Pages deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) 
      throws com.google.gson.JsonParseException { 
     JsonObject object = json.getAsJsonObject(); 

     Pages p = new Pages(); 
     object.entrySet().forEach(e -> { 
      JsonObject tmp = e.getValue().getAsJsonObject(); 
      if(tmp.get("pageid") != null) { 
       // right object 
       p._42010 = new _42010(); 
       p._42010.ns = tmp.get("ns").getAsInt(); 
       p._42010.pageid = tmp.get("pageid").getAsInt(); 
       p._42010.title = tmp.get("title").getAsString(); 
      } 
     }); 

     return p; 
    } 

} 

public static class Pages { 

    _42010 _42010; 

    @Override 
    public String toString() { 
     return _42010.toString(); 
    } 


} 

public static class _42010 { 
    int pageid; 
    int ns; 
    String title; 

    @Override 
    public String toString() { 
     return title + " " + pageid + " " + ns; 
    } 
} 

}

デシリアライザは、単にPAGEIDを含有し、そのクラスを移入ものを見つけるためにエントリをチェックします。

は、私のテストを実行すると、あなたを与える:私はあなたのJSONライブラリとしてGsonを使用していると仮定しています

Queen (band) 42010 0 
Queen (band) 12345 0 

よろしく、

アルトゥル

+0

Deserializerで使用される 'Type'クラスは何ですか?どの図書館から来たのですか? – Shankar

+0

これはGsonライブラリです。私はそれがあなたのものと同じだと信じていますか?私はスニペットに私の輸入を追加します – pandaadb

+0

ありがとう..これは私が期待していたものです.. – Shankar

0

なぜjacksonやorg.jsonのようなJSONライブラリを使用しないのですか?

{ 
"pages":{ 
     "42010":{ 
       "pageid":42010, 
       "ns":0, 
       "title":"Queen (band)" 
       } 
     } 
} 

のようなあなたのJSONが正しいくださいそして、あなたは好きそれを使用することができるようになります。

JSONObject jsonObjet = new JSONObject(yourJson); 
jsonObjet.get("pages"); 
+0

@Gregoire PORTIER:毎回私は直接 'title'を得るのですか、[42010]ページ内に新しいint型の値を取得しています。 – Shankar

+1

このスレッドをチェック:http://stackoverflow.com/questions/20899839/retreiving-values-from-nested-json-object これはシンプルで、使い方を学ぶのに非常に便利です。 JavaでJsonを使用する場合は、imo org.jsonを使用する方が簡単です。 – GreGGus

0

理想的には、それはMapを使用する必要があります。

これは、値をMap<Integer, Pojo>とするのに役立ちます。

は、あなたが変更番号を無視するカスタムデシリアライザを使用することができます

public class Pojo{ 
    private int pageid; 
    private String title; 
    private int ns; 
    // getter and setter 
} 

これは、実行時に生成された乱数を保持する必要性を、充分で、

+0

私はjsonをjavaに変換するためにGSONライブラリを使用しているので、上記のコードは機能しません。 – Shankar

関連する問題