XML和JSON

xml和json都是流行的数据传输、存储格式。经常用于客户端和服务器交换数据和本地存储数据。实际上,xml更常用于配置文件的编写,或者作为某种结构化的文档存储数据,而json更常用于网络应用中和服务器交互数据。

XML的生成和解析

Android中使用XmlSerializer生成xml文件,使用XmlPullParser解析xml文件。

生成和解析XML例子:

public void createXML()
{
    FileOutputStream fileOutputStream = null;
    try
    {
        fileOutputStream = openFileOutput("user.xml", MODE_PRIVATE);
        XmlSerializer xmlSerializer = Xml.newSerializer();
        xmlSerializer.setOutput(fileOutputStream, "UTF-8");

        //encoding 编码 standalone 是否引用约束文件
        xmlSerializer.startDocument("UTF-8", true);

        //namespace 名称空间 name 标签名
        xmlSerializer.startTag(null, "users");
        xmlSerializer.startTag(null, "user");
        xmlSerializer.startTag(null, "name");
        xmlSerializer.text("admin");
        xmlSerializer.endTag(null, "name");
        xmlSerializer.startTag(null, "password");
        xmlSerializer.attribute(null, "test_attr", "test_value");
        xmlSerializer.text("123");
        xmlSerializer.endTag(null, "password");
        xmlSerializer.endTag(null, "user");
        xmlSerializer.endTag(null, "users");

        xmlSerializer.endDocument();
        xmlSerializer.flush();
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
    finally
    {
        if(fileOutputStream != null)
        {
            try
            {
                fileOutputStream.close();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }
}

public void parseXML()
{
    FileInputStream fileInputStream = null;
    try
    {
        fileInputStream = openFileInput("user.xml");
        XmlPullParser xmlPullParser = Xml.newPullParser();
        xmlPullParser.setInput(fileInputStream, "UTF-8");

        int eventType = xmlPullParser.getEventType();
        while(eventType != XmlPullParser.END_DOCUMENT)
        {
            String name = xmlPullParser.getName();
            if(eventType == XmlPullParser.START_TAG)
            {
                if("name".equals(name))
                {
                    show(xmlPullParser.nextText());
                }
                if("password".equals(name))
                {
                    show(xmlPullParser.getAttributeValue(null, "test_attr"));
                    show(xmlPullParser.nextText());
                }
            }
            eventType = xmlPullParser.next();
        }

    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
    finally
    {
        try
        {
            fileInputStream.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

注:代码中show()其实就是使用吐司显示一下数据。实际开发中,应该根据实际需求,安排pull解析器的各种事件处理。

JSON的生成和解析

Android中使用JsonObject进行json的生成和解析。这个JsonObject是Android框架提供的,在JavaSE中是不存在的。

生成和解析json:

public void createJSON()
{
    JSONObject jsonObject = new JSONObject();
    JSONArray users = new JSONArray();
    JSONObject user = new JSONObject();
    try
    {
        user.put("username", "admin");
        user.put("password", "123");
        users.put(user);
        jsonObject.put("users", users);

        String json = jsonObject.toString();
        FileOutputStream fileOutputStream = openFileOutput("test.json", MODE_PRIVATE);
        fileOutputStream.write(json.getBytes());
        fileOutputStream.close();
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

public void parseJSON()
{
    try
    {
        FileInputStream fileInputStream = openFileInput("test.json");
        String json = "";
        byte[] buffer = new byte[1024];
        int read;
        while((read = fileInputStream.read(buffer)) != -1)
        {
            json += new String(buffer, 0, read);
        }
        fileInputStream.close();

        JSONObject jsonObject = new JSONObject(json);
        JSONArray users = jsonObject.getJSONArray("users");
        for(int i = 0; i < users.length(); i++)
        {
            JSONObject user = (JSONObject) users.get(i);
            String name = user.getString("username");
            String password = user.getString("password");
            show(name + " " + password);
        }

    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

总体来看JsonObject使用起来还是比较麻烦的,我们生成json和解析json,就像一步步搭积木,再一步步拆掉。我们可能需要直接将json映射成Java类的工具,这时可以看看Jackson库,参考:/Java/第三方库/jackson-json解析库

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。