自定义JSON解析(Gson)

mwg9r5ms  于 2022-11-06  发布在  其他
关注(0)|答案(3)|浏览(260)

如何自定义特定字段的序列化/反序列化?
下面是我的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并得到一个String type;的JAVA对象,但是我想拆分Type字符串并得到一个String[]类型。

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
}
35g0bw71

35g0bw711#

您需要实现自定义类型适配器。
你可以这样做:

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 Bean:

@Expose
private String Type;

至:

@Expose
private String[] Type;

如果您需要序列化MyClass对象,以便将“Type”数组转换为String逗号分隔的字符串,则可以使用相同的方法添加序列化程序!

yeotifhr

yeotifhr2#

简单。Json允许你使用数字(整型/长整型/双精度型)、字符串、列表或对象。你需要的是一个列表。
JSON格式:
【类型】:{【类型】:“数组”、“项”:{“类型”:“字符串”} }
例如,“类型”:[“甲”、“B”、“丙”、“丁”]

  • 你好
List<String> Type;

稍后,您可以使用任何Java List实现,如ArrayList。
例如,类型=新数组列表();

r7s23pms

r7s23pms3#

您可以使用JsonAdapter来实现这一点下面是文档中示例

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]);
     }
   }

由于User类在@JsonAdapter注解中指定了UserJsonAdapter.class,因此将自动调用它来序列化/反序列化User示例。下面是如何将此注解应用于字段的示例。

private static final class Gadget {
     @JsonAdapter(UserJsonAdapter2.class)
     final User user;
     Gadget(User user) {
       this.user = user;
     }
   }

可以在一个字段、该字段的类型和com. google. gson. GsonBuilder中指定不同的类型适配器。字段注解优先于GsonBuilder注册的类型适配器,而GsonBuilder注册的类型适配器又优先于注解的类型。
此注解引用得类必须是TypeAdapter或TypeAdapterFactory,或者必须实现JsonDeserializer或JsonSerializer中得一个或两个.使用TypeAdapterFactory可以委托给封闭得Gson示例.

相关问题