使用Gson将自定义类的ArrayList序列化为JSON并通过HTTP发送数据

时间:2016-04-24 14:39:26

标签: java android json post gson

我想将ArrayList中的数据转换为JSON,然后将其发送到我的网络服务器。列表mTeamDataList的类型为ArrayList<TeamData>

TeamData类是:

public class TeamData
{
    String mFullName;
    String mShortName;
    String mLeague;

    //constructor, getters and setters are here
}

我有一个addTeamsToDB()方法,负责将数组中的数据写入Web服务器。以下是我到目前为止的情况:

public static void addTeamsToDB()
{
    if(mTeamDataList.size() == 0)
        return;

    HttpURLConnection urlConnection = null;
    String addTeamURL = "http://api.somewebsite.com/add_team.php";

    try
    {
        Gson gson = new Gson();
        URL urlObj = new URL(addTeamURL);
        urlConnection = (HttpURLConnection) urlObj.openConnection();
        urlConnection.setDoOutput(true);
        urlConnection.setRequestMethod("POST");
        urlConnection.connect();

        //I believe converting to json goes here

        OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());

    } 
    catch (IOException e)
    {
        e.printStackTrace();
    }
    finally
    {
        assert urlConnection != null;
        urlConnection.disconnect();
    }
}

我在SO上找到了几个答案,但他们只展示了插入一个对象或硬编码数据的基本示例。我没有找到一个使用Gson将自定义数据类型对象数组转换为JSON。

是否有方法可以执行此操作或是否必须通过循环手动转换数组中的每个项目?

我正在关注this教程,但他正在使用NameValuePairs类来实现这一目标。但它已被弃用,所以我不确定要使用什么。

此外,本教程使用内置的JSON java库,因此如果有人可以显示Gson方式,那将非常有用。

2 个答案:

答案 0 :(得分:7)

如果你的课程只有你发布的内容,那么在你的ArrayList上直接使用Gson的toJson(Object src, Type typeOfSrc)应该没有问题:

Type listType = new TypeToken<ArrayList<TeamData>>() {}.getType();
String json = gson.toJson(mTeamDataList, listType);

原因是,您的TeamData类只有通用字段。

当然,如果您希望“密钥”出现在JSON中,则应在类成员上添加@SerializedName注释。

然后,要使用您的HttpUrlConnection发送数据,请将您声明out变量的行替换为:

OutputStreamWriter wr= new OutputStreamWriter(urlConnection.getOutputStream());
wr.write(json);

答案 1 :(得分:1)

使用类似这样的课程,

import com.google.gson.annotations.SerializedName;

import java.util.ArrayList;

/**
 * @author Krish
 */
public class TeamDataList {

    @SerializedName("mTeamDataList")
    private ArrayList<TeamData> mTeamDataList;

    public TeamDataList(ArrayList<TeamData> teamDataList) {
        this.mTeamDataList = teamDataList;
    }

    public class TeamData {
        @SerializedName("mFullName")
        String mFullName;
        @SerializedName("mShortName")
        String mShortName;
        @SerializedName("mLeague")
        String mLeague;

        //constructor, getters and setters are here
    }

}

并使用此方法进行序列化,

public static String toJson(Object object) {
        Gson gson = new Gson();
        return gson.toJson(object);
    }