簡體   English   中英

使用 Gson 序列化復雜集

[英]Use Gson to serialize complex set

我有一個方法setFriends() ,它需要一個 Set。 此方法在另一個模塊中,我想通過 Gson().fromJson() 發送setFriends()序列化數據。 我不確定我的arg字符串是否正確。 我嘗試了以下失敗的方法:

// my attempt to serialize
String arg = "[Friend[name=Dave, relationship=Relationship[Work]], Friend[name=Jack, relationship=Relationship[School]]]"; // not sure if this string is correct
Type type = new TypeToken<Set<Friend>>(){}.getType();
Set<Friend> payload = new Gson().fromJson(arg, type);
sendPayload(payload); // will send payload to People.setFriends()



// code from the other module:

Set<Friend>

public class People {
    public void setFriends(Set<Friend> friends) { ... }
}

public class Friend {
    String name;
    Relationship relationship;
}

public enum Relationship {
    School,
    Work
}

Google Gson 是一個簡單的基於 Java 的庫,用於將 Java 對象序列化為 JSON,反之亦然。
在 JSON 中,我們使用{}表示對象。 對於嵌套對象,我們使用"fieldName": {<nested object>}
在您的示例中,我將relationship視為枚舉。 並引入Address為嵌套的 object。 Friend object 的 JSON 將如下所示:

{ 
  "name" : "Dave",
  "relationship" : "WORK",
  "address" : {"street" : "s1"}
}

JSON 中沒有 Set 結構的表示形式,因此您將元素放入列表中。

以下是示例 java 代碼:

public class Test
{
    public static void main(String[] args)
    {
        String arg = "["
                + "{\"name\":\"Dave\",\"relationship\":\"WORK\",\"address\":{\"street\":\"s1\"}},"
                + "{\"name\":\"Jack\",\"relationship\":\"SCHOOL\",\"address\":{\"street\":\"s2\"}},"
                + "{\"name\":\"Dave\",\"relationship\":\"GYM\",\"address\":{\"street\":\"s3\"}}"
                + "]";
        Type type = new TypeToken<Set<Friend>>(){}.getType();
        Set<Friend> payload = new Gson().fromJson(arg, type);
        sendPayload(payload);
    }
    static void sendPayload(Set<Friend> plod) {
        System.out.println("Sent payload: " + plod.toString());
    }
}

class Friend {
    private String name;
    private Relationship relationship;
    private Address address;

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public Relationship getRelationship() {
        return relationship;
    }

    public void setRelationship(Relationship relationship) {
        this.relationship = relationship;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    public String toString() {
        return this.name;
    }

    @Override
    public int hashCode() {
        return name.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        return name.equals(obj.toString());
    }
    
}

enum Relationship {
    WORK, SCHOOL, GYM
}

class Address {
    String street;

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }
}

Output:

Sent payload: [Dave, Jack]

在我的環境中 Gson 返回LinkedHashSet object。 如果你想要不同的集合,比如排序的。 然后您可以將 Json 反序列化為List<Freind>然后將其轉換為所需的集合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM