2016-09-21 26 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