2017-06-22 141 views
1

基本上,即時從包含名爲「引用」的字符串數組的服務器的服務器獲取JSON響應。如果沒有找到之前的參考或者以前的參考填充,它可以是空的。如何從Java中的JSON字符串填充字符串數組

這是我從服務器得到的響應。

{"code":100, 

"name":"3PVxkvfKyUiBg3LN24ek23KceGg6350KSkLZ.html", 

    "file":{ 
     "author":"[email protected]", 

     "idx":"xihav-zupak-zonyf-bedid-cyvun-fahac-mykud", 

     "name":"html_file", 

     "references":[ 
       "relec-toluz", 

       "rosah-vyzyh", 

       "rikik-cinom" 
     ] 
    } 
} 

我在這個時刻做的不是很好,我第一次解析引用的內容,以確定然後創建新的String數組的引用數,並把每個值在裏面。不過,我想知道是否有任何適當的方式來做到這一點。

這是我寫的代碼,這是不是一個真正的好的一段代碼:

if(file.has("references")){ 
       String s = file.get("references").toString(); 
       int counter =0; 
       //determine the amount of elements (check if the references does not finish with ',' 
       if(s.length() > 2 && s.charAt(s.length()-2) != ','){ 
        counter++; 
        System.out.println(s); 
        for(int i=0 ; i < s.length(); i++){ if(s.charAt(i) == ',') counter++;} 
       }else { 
        counter++; 
        for(int i = 0; i < s.length() -2; i++){ if(s.charAt(i) == ',') counter++;} 
       } 
       JsonArray referencesList = new Gson().fromJson(s, JsonArray.class); 

       if(s != null && s.length()>2 && counter !=0){ 
        System.out.println("1"); 
        references = new String[counter]; 
        for(int i = 0 ; i < references.length ; i++){ references[i] = referencesList.get(i).getAsString();} 
       }else references = new String[]{"No previous references found"}; 
      } 

的代碼工作得很好了我的需要,但沒有任何其他辦法可以做到更「正確」?

+2

你沒有使用'JSONParser'任何理由嗎?檢查出:https://stackoverflow.com/questions/43724937/how-to-parse-json-string-to-java-object-with-jackson – yogidilip

+0

@yogidilip以及我一直在使用Google的GSON爲我的整個項目,因爲我發現它更易於使用。這就是爲什麼。 – retArdos

+2

那麼你絕對應該考慮使用Gson的'JsonParser'。將解析留給Gson,只處理生成的'JsonElement'。 – Ishnark

回答

0

我分析我自己,而不是這樣做的權利。所以我重寫了一些部分,刪除了計數器部分,並剛剛發現了JSonArray的size()方法,這是我以前沒有檢查過的。

我的最後一段代碼更短,更易於閱讀。

String[] references = null; 

String repCode = " 
{ 
    "code":100, 

    "name":"3PVxkvfKyUiBg3LN24ek23KceGg6350KSkLZ.html", 

    "file":{ 
    "author":"[email protected]", 

    "idx":"xihav-zupak-zonyf-bedid", 

    "name":"random", 

    "references":[ 
      "relec-toluz", 

      "rosah-vyzyh", 

      "rikik-cinom" 
     ] 
    } 
}" 

字符串repCode是我從我查詢的服務器獲得的響應。

JsonObject file = new Gson().fromJson(repCode.get("file").toString(),JsonObject.class); 

if(file.has("references") && file.get("references").isJsonArray()){ 
    JsonArray referencesList = file.get("references").getAsJsonArray(); 

    if(referencesList.size() != 0){ 
     references = new String[referencesList.size()]; 
     for(int i = 0 ; i < references.length ; i++){ 
      references[i] = referencesList.get(i).getAsString(); 
     } 
    }else references = new String[]{"No previous references found"}; 
} 

最後以顯示:

for(String ref: references){ 
     System.out.println("Ref: " + ref); 
    } 

這給下面的輸出:

Ref: relec-toluz 
Ref: rosah-vyzyh 
Ref: rikik-cinom 
0
if you wan to do this properly, you need before to create a pojo class for your json 

public class ClassName{ 

private String code; 
private String name; 
private MyFile file; 
...... 
} 

public class MyFile{ 

private String author; 
private String idx; 
...... 
} 

Now after that, you're ready to map your json on your pojo object, you can do it easly using jackson. 


for your documentation 

https://github.com/FasterXML/jackson-docs 

So you need to add jackson on your project and you can do something like this for your mapping. 

ObjectMapper mapper = new ObjectMapper(); 
String jsonInString = "{'name' : 'qdqsdqs'}"; 


//JSON from URL to Object 
ClassName result = mapper.readValue(jsonInString , ClassName.class); 
0

一個好的開始是使用Json解析器解析Json。由於您使用的是Gson,因此您應該查看JsonParser以進行解析。最好不要手動。

一些關鍵步驟包括:

  1. 解析JSON(我要你給我的JSON,並把它作爲一個字符串,但你可以很容易地從文件中解析它),並獲得JsonElement
  2. 看那JsonElementfile成員,這是又將JsonElement,並期待在這JsonElementreferences成員,你知道是JsonArray
  3. 遍歷JsonArray並添加到字符串列表中。返回一個字符串該列表作爲一個String[]

    public static void main(String[] args) { 
        String json = "{\"code\":100,\n" + 
          "\n" + 
          " \"name\":\"3PVxkvfKyUiBg3LN24ek23KceGg6350KSkLZ.html\",\n" +  
          "\n" + 
          " \"file\":{\n" + 
          "   \"author\":\"[email protected]\",\n" + 
          "\n" + 
          "   \"idx\":\"xihav-zupak-zonyf-bedid-cyvun-fahac-mykud\",\n" + 
          "\n" + 
          "   \"name\":\"html_file\",\n" + 
          "\n" + 
          "   \"references\":[\n" + 
          "    \"relec-toluz\",\n" + 
          "\n" + 
          "    \"rosah-vyzyh\",\n" + 
          "\n" + 
          "    \"rikik-cinom\"\n" + 
          "  ]\n" + 
          " }\n" + 
          "}"; 
        JsonElement element = new JsonParser().parse(json); 
        System.out.println(Arrays.toString(getReferences(element))); 
    
    } 
    
    private static String[] getReferences(JsonElement jsonElement) { 
        List<String> refList = new ArrayList<>(); 
        JsonArray references = jsonElement.getAsJsonObject().get("file").getAsJsonObject().get("references").getAsJsonArray(); 
        references.forEach((reference) -> refList.add(reference.getAsString())); 
        return refList.toArray(new String[0]); 
    }