使用Gson序列化复杂集合

slhcrj9b  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(174)

我有一个方法,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
}
anauzrmj

anauzrmj1#

Google Gson是一个简单的基于Java的库,用于将Java对象序列化为JSON,反之亦然。
在JSON中,我们使用{}表示对象,对于嵌套对象,我们使用"fieldName": {<nested object>}
在你的例子中,我把relationship当作一个枚举,并把Address当作一个嵌套对象,Friend对象的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;
    }
}

输出量:

Sent payload: [Dave, Jack]

在我的环境中,Gson返回了LinkedHashSet对象。如果你想要不同的集合,比如排序的集合。那么你可以将Json反序列化为List<Freind>,然后将其转换为所需的集合。

相关问题