2016-09-21 57 views
0

例如我的JSON文本就像這樣。JSON文本到隨機數字生成的Java轉換問題

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

因爲每次我的JSON文本與不同數量是內頁標籤來。

如何將其轉換爲Java等效類?

目前我生成的java類是這樣的。

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

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

_42010類包含像"pageid":42010,"ns":0,"title":"Queen (band)"內場,因爲我得到的內部pages每次新號碼,它不工作。它只爲特定的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,然後填充類中的一個。

運行我的測試爲您提供:

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

我假設你正在使用GSON爲您的JSON庫。

問候,

阿圖爾

+0

您能否告訴我在Deserializer中使用的Type類是什麼?哪個庫是從哪裏來的? – Shankar

+0

這是Gson庫。我相信這和你的一樣嗎?我會將我的進口添加到片段 – pandaadb

+0

非常感謝..這就是我期待的.. – Shankar

0

爲什麼不使用像傑克遜或org.json這樣的JSON庫?

讓你的JSON糾正像

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

而且你將能夠使用它像:

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

@Gregoire波特爾:每次我得到裏面我如何直接將'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

由於我使用GSON庫將json轉換爲java,因此上述代碼無法正常工作。 – Shankar