【问题标题】:Serialize ArrayList of custom class to JSON using Gson and send data over HTTP使用 Gson 将自定义类的 ArrayList 序列化为 JSON 并通过 HTTP 发送数据
【发布时间】:2016-04-24 14:39:26
【问题描述】:

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

TeamData 类是:

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

    //constructor, getters and setters are here
}

我有一个addTeamsToDB() 方法负责将数组中的数据写入网络服务器。这是我目前所拥有的:

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 方式,那将非常有帮助。

【问题讨论】:

    标签: java android json post gson


    【解决方案1】:

    如果您的课程仅包含您发布的内容,那么直接在您的 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);
    

    【讨论】:

    • 所以我可以创建一个循环并使用该方法将数组中的每个对象转换为 json 字符串,对吗?但是我将如何制作代表数组中所有数据的 json 字符串,而不是一次只显示一个对象?
    • 好的,谢谢,这有帮助,但是我怎样才能发送该 json 字符串以供 php 脚本读取?
    • 这行得通吗:OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream()); out.write(jsonString.getBytes());?我读到最好使用OutputStream 而不是OutputStreamWriter。不确定这是否会影响 php 脚本。
    • 还有一件事,如果我将@SerializedName 注释添加到我的类成员中,我会在括号中放入与成员变量相同的名称还是数据库中的实际列名?非常感谢您的帮助!
    • 你可以把任何你想要的东西放在括号里。重要的是另一端的 php 脚本以正确的方式解释它,并以正确的方式将其存储在数据库中。如果您使用的是 NoSQL 数据库,那么使用与数据库列相同的名称可能是有意义的。但这是你的选择
    【解决方案2】:

    使用一些这样认为的类,

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

    【讨论】:

    • 如果没有 mTeamDataList 中的数组名称,怎么办?
    • @ChinmoyPanda 使用上述答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多