如何在deserialize方法中从json对象获取字符串数组

时间:2018-02-14 14:22:55

标签: java json gson json-deserialization

我有一些json对象

{
  "name": "John",
  "age": 29,
  "bestFriends": [
    "Stan",
    "Nick",
    "Alex"
  ]
}

这是我对JsonDeserializer的实现:

public class CustomDeserializer implements JsonDeserializer<Person>{
    @Override
    public Person deserialize(JsonElement json, Type type, JsonDeserializationContext cnxt){
        JsonObject object = json.getAsJsonObject();
        String name = new String(object.get("name").getAsString());
        Integer age = new Integer(object.get("age").getAsInt());
        String bestFriends[] = ?????????????????????????????????
        return new Person(name, age, bestFriends);
    }
}

如何使用GSON库从json对象获取字符串数组?

非常感谢!

3 个答案:

答案 0 :(得分:1)

对于反序列化器,您可以遍历ArrayNode并将值一个接一个地添加到String []。

ArrayNode friendsNode = (ArrayNode)object.get("bestFriends");
List<String> bestFriends = new ArrayList<String>();
for(JsonNode friend : friendsNode){
   bestFriends.add(friend.asText());
}
//if you require the String[]
bestFriends.toArray();

答案 1 :(得分:0)

试试这个会对你有用。感谢。

Open repositorys:
C:\temt\repo
Error: cannot spawn .git/hooks/post-checkout: No such file or directory

答案 2 :(得分:0)

我要感谢所有回答我问题的人,同时我发现我的决定(下面的内容)是最恰当的答案。因为我不需要使用除GSON之外的任何其他库。 当我问我的问题时,我不知道com.google.gson.TypeAdapter是比JsonSerializer / JsonDeserializer更有效的工具。 在下面我找到了解决问题的决定:

package mytypeadapter;
import com.google.gson.Gson;
import java.io.IOException;
import java.util.List;
import java.util.ArrayList;
import com.google.gson.GsonBuilder; 
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;

public class Main {
    static class Person{ 
       String name; 
       int age; 
       String[] bestFriends; 

       Person() {}       
       Person(String name, int population, String... cities){ 
          this.name = name; 
          this.age = population; 
          this.bestFriends = cities; 
       } 
    }    

    public static void main(String[] args) {
        class PersonAdapter extends TypeAdapter<Person>{
            @Override 
            public Person read (JsonReader jsonReader) throws IOException{
                Person country = new Person();
                List <String> cities = new ArrayList<>();
                jsonReader.beginObject();
                while(jsonReader.hasNext()){
                    switch(jsonReader.nextName()){
                        case "name":
                            country.name = jsonReader.nextString();
                            break;
                        case "age":
                            country.age = jsonReader.nextInt();
                            break;
                        case "bestFriends":
                            jsonReader.beginArray();
                            while(jsonReader.hasNext()){
                                cities.add(jsonReader.nextString());
                            }
                            jsonReader.endArray();
                            country.bestFriends = cities.toArray(new String[0]);
                            break;                          
                    }
                }
                jsonReader.endObject();
                return country;             
            }

            @Override
            public void write (JsonWriter jsonWriter, Person country) throws IOException{
                jsonWriter.beginObject();
                jsonWriter.name("name").value(country.name);
                jsonWriter.name("age").value(country.age);
                jsonWriter.name("bestFriends");
                jsonWriter.beginArray();
                for(int i=0;i<country.bestFriends.length;i++){
                    jsonWriter.value(country.bestFriends[i]);
                }
                jsonWriter.endArray();
                jsonWriter.endObject();
            }
        }
        Gson gson = new GsonBuilder()
                    .registerTypeAdapter(Person.class, new PersonAdapter())
                    .setPrettyPrinting()
                    .create();
        Person person, personFromJson;
        person = new Person ("Vasya", 29, "Stan", "Nick", "Alex");
        String json = gson.toJson(person); 
        personFromJson = new Person();
        personFromJson = gson.fromJson(json, personFromJson.getClass());
        System.out.println("Name = "+ personFromJson.name);
        System.out.println("Age = "+ personFromJson.age);
        for(String friend : personFromJson.bestFriends){
            System.out.println("Best friend "+ friend);
        }
    }
}