2013-06-23 54 views
1

每一行我有一個Java項目中,我必須建立從JSON輸入一個對象,它自帶的格式如下:閱讀從JSON客體與GSON

{ 
    "Shell": 13401, 
    "JavaScript": 2693931, 
    "Ruby": 2264, 
    "C": 111534, 
    "C++": 940606, 
    "Python": 39021, 
    "R": 2216, 
    "D": 35036, 
    "Objective-C": 4913 
} 

然後在我的代碼,我有:

public void fetchProjectLanguages(Project project) throws IOException { 
    List<Language> languages = null; 

    String searchUrl = String.format("%s/repos/%s/%s/languages", 
      REPO_API, project.getUser().getLogin(), project.getName()); 

    String jsonString = requests.get(searchUrl); 
    Language lang = gson.fromJson(jsonString, Language.class); 

    languages.add(lang); 
} 

Language對象由兩個屬性:nameloc,以及JSON輸入本身並不代表一種語言,但一個設置的語言,作爲對象的每個線語言本身。在我的例子中:shell,javascript,ruby,c,C++,python,R,D和Objective-C。

它如何做到這一點?

我感謝任何幫助!

回答

1

您可以使用adapter

假設你有:

class Language 
{ 
    public String name; 
    public Integer loc; 
} 

class Languages 
{ 
    public List<Language> list = new ArrayList<Language>(); 
} 

適配器:

class LanguagesTypeAdapter implements JsonSerializer<Languages>, JsonDeserializer<Languages> 
{ 
     public JsonElement serialize(Languages languages, Type typeOfT, JsonSerializationContext context) 
     { 
      JsonObject json = new JsonObject(); 

      for (Language language : languages.list) 
      { 
       json.addProperty(language.name, language.loc); 
      } 

      return json; 
     } 

     public Languages deserialize(JsonElement element, Type typeOfT, JsonDeserializationContext context) throws JsonParseException 
     { 
      JsonObject json = element.getAsJsonObject(); 

      Languages languages = new Languages(); 

      for (Entry<String, JsonElement> entry : json.entrySet()) 
      { 
       String name = entry.getKey(); 
       Integer loc = entry.getValue().getAsInt(); 

       Language language = new Language(); 
       language.name = name; 
       language.loc = loc; 

       languages.list.add(language); 
      } 

      return languages; 
     } 
} 

和樣本:

GsonBuilder builder = new GsonBuilder(); 
builder.registerTypeAdapter(Languages.class, new LanguagesTypeAdapter()); 

Gson gson = builder.create(); 

Languages languages = gson.fromJson("{"+ 
      "\"Shell\": 13401,"+ 
      "\"JavaScript\": 2693931,"+ 
      "\"Ruby\": 2264,"+ 
      "\"C\": 111534,"+ 
      "\"C++\": 940606,"+ 
      "\"Python\": 39021,"+ 
      "\"R\": 2216,"+ 
      "\"D\": 35036,"+ 
      "\"Objective-C\": 4913"+ 
     "}", Languages.class); 

String json = gson.toJson(languages); 

結果:

{"Shell":13401,"JavaScript":2693931,"Ruby":2264,"C":111534,"C++":940606,"Python":39021,"R":2216,"D":35036,"Objective-C":4913} 

希望這有助於...

0

您可以試一試Map<String, String> map = gson.fromJson(json, new TypeToken<Map<String, String>>() {}.getType());以獲得語言/價值的地圖。