Java 自定义JSON解析(Gson)

Java 自定义JSON解析(Gson),java,json,gson,Java,Json,Gson,如何自定义特定字段的序列化/反序列化 以下是我的json: [{ "Short Name": "X", "Address": "X Address", "Latitude": 40.739982, "Longitude": -73.978053, "Type": "A, B" }, { "Short Name": "Y", "Address": "Y Address", "Latitude": 40.852856, "Longitude": -73.938098, "Type": "A, B,

如何自定义特定字段的序列化/反序列化

以下是我的json:

[{
"Short Name": "X",
"Address": "X Address",
"Latitude": 40.739982,
"Longitude": -73.978053,
"Type": "A, B"
},
{
"Short Name": "Y",
"Address": "Y Address",
"Latitude": 40.852856,
"Longitude": -73.938098,
"Type": "A, B, C, D"
}]
使用Gson,现在我可以解析json并使用
字符串类型
但是我想拆分类型字符串并获得类型
字符串[]

public class MyClass {
    @SerializedName("Short Name")
    @Expose
    private String ShortName;

    @Expose
    private String Address;

    @Expose
    private Double Latitude;

    @Expose
    private Double Longitude; 

    @Expose
    private String Type; 
    // how can I split the string 
    // and get private String[] Type;
    // when deserializing
}

简单。Json允许您使用数字(Int/Long/Double)、字符串、列表或对象。你需要的是一份清单

JSON:

“类型”:{ “类型”:“数组”, “项”:{“类型”:“字符串”} }

e、 g.“类型”:[“A”、“B”、“C”、“D”]

爪哇:

List<String> Type;
列表类型;
稍后,您可以使用任何Java列表实现,如ArrayList


e、 g.Type=newarraylist()

您需要实现一个自定义类型适配器

您可以这样做:

JsonDeserializer<String[]> deserializer = new JsonDeserializer<String[]>() {

    @Override
    public String[] deserialize(JsonElement jsonElem, Type type,
            JsonDeserializationContext context) throws JsonParseException {

        if(jsonElem == null) {
            return null;
        }

        return jsonElem.getAsString().split(", ");
    }

};

Gson gson = new GsonBuilder()
                    .registerTypeAdapter(String[].class, deserializer)
                    .create();

Type listType = new TypeToken<ArrayList<MyClass>>() {}.getType();
List<MyClass> t = gson.fromJson(json, listType);
致:


同样,如果需要序列化MyClass对象以将“Type”数组转换为逗号分隔的字符串,则可以添加序列化程序

您可以使用JsonAdapter来实现这一点。 以下是来自ducumentation的示例

Here is an example of how this annotation is used:
   @JsonAdapter(UserJsonAdapter.class)
   public class User {
     public final String firstName, lastName;
     private User(String firstName, String lastName) {
       this.firstName = firstName;
       this.lastName = lastName;
     }
   }
   public class UserJsonAdapter extends TypeAdapter<User> {
     @Override public void write(JsonWriter out, User user) throws IOException {
       // implement write: combine firstName and lastName into name
       out.beginObject();
       out.name("name");
       out.value(user.firstName + " " + user.lastName);
       out.endObject();
       // implement the write method
     }
     @Override public User read(JsonReader in) throws IOException {
       // implement read: split name into firstName and lastName
       in.beginObject();
       in.nextName();
       String[] nameParts = in.nextString().split(" ");
       in.endObject();
       return new User(nameParts[0], nameParts[1]);
     }
   }
   
可以在一个字段、该字段的类型和com.google.gson.GsonBuilder中指定不同的类型适配器。字段注释优先于GsonBuilder注册的类型适配器,后者又优先于带注释的类型


此注释引用的类必须是TypeAdapter或TypeAdapterFactory,或者必须实现JsonDeserializer或JsonSerializer中的一个或两个。使用TypeAdapterFactory可以委托给封闭的Gson实例。

这不是问题的解决方案。他需要反序列化数组中逗号分隔的一串值。这不是一个json数组:“Type”:“a,B,C,D”我认为关键是他应该更改他的json,使“Type”实际上是一个json数组。这将为他提供一个更清晰的实现,而不是将数组隐藏在逗号分隔的字符串中。谢谢。我试试这个,然后告诉你。
@Expose
private String[] Type;
Here is an example of how this annotation is used:
   @JsonAdapter(UserJsonAdapter.class)
   public class User {
     public final String firstName, lastName;
     private User(String firstName, String lastName) {
       this.firstName = firstName;
       this.lastName = lastName;
     }
   }
   public class UserJsonAdapter extends TypeAdapter<User> {
     @Override public void write(JsonWriter out, User user) throws IOException {
       // implement write: combine firstName and lastName into name
       out.beginObject();
       out.name("name");
       out.value(user.firstName + " " + user.lastName);
       out.endObject();
       // implement the write method
     }
     @Override public User read(JsonReader in) throws IOException {
       // implement read: split name into firstName and lastName
       in.beginObject();
       in.nextName();
       String[] nameParts = in.nextString().split(" ");
       in.endObject();
       return new User(nameParts[0], nameParts[1]);
     }
   }
   
   private static final class Gadget {
     @JsonAdapter(UserJsonAdapter2.class)
     final User user;
     Gadget(User user) {
       this.user = user;
     }
   }