java和js中JSONObject,JSONArray,Map,String之间转换

by admin on 2020年1月23日

一、
JSON(JavaScript Object
Notation)是一种轻量级的数据交换格式。易于人阅读和编写。同时,也易于机器解析和生成。
二、JSON数据格式解析:
和XML一样,JSON也是基于存文本的数据格式。您可以用JSON传输一个简单的String、Number、Boolean,也可以传输一个数组或者一个复杂的Object对象。
例如:
1、用JSON表示一个简单String “abc”,其格式为:”abc”。除了字符“,,/
和一些控制符(b,n,t等)需要编码外,其他Unicode字符可以直接输出。
2、用JSON表示一个数组对象,使用“[
]“包含所有元素,每个元素用逗号分隔,元素可以使任意的value,例如,一下数组包含了一个String、Number、Boolean、和一个null:
[“abc”,123,false,null]澳门新葡亰网址下载,。
3、Object对象在JSON中用“{
}“包含一系列无序的Key-Value键值对表示,实际上此处的Object相当于Java中的Map。注意Key只能用String表示。例如:一个
Address对象包含如下Key-Value:
{“city”:”beijing”,”street”:”chaoyang”,”postcode”:100025}。
三、JAVASCRIPT处理JSON数据
Function demo(){
var v={“name”:”SMITH”,”address”:
{“city”:”beijing”,”street”:”chaoyang”,”postcode”:100025}};
document.write(v.name);
document.write(v.address.city);
}
四:JSON和XML的比较
XML和JSON都是用结构化方法来标记数据,下面来做一个简单的比较。
<?xml version=”1.0” encoding=”utf-8”?>
<country>
<name>中国</name>
<province>
<name>黑龙江</name>
<citys>
<city>哈尔滨</city>
<city>大庆</city>
</citys>
</province>
</country>

本文主要讲述如下几个内容:

————————————————–Java中————————————————————–

用JSON表示如下:
{
name:”中国”,
province:[
{
Name:”黑龙江”,citys:{“哈尔滨”,”大庆”}
}
]
}
XML比JSON更有可读性。不过,我们读起来费解的语言,恰恰是适合机器阅读的。编写的手写难度来说,XML还是舒服一些,好读当然就好写。不过写出来的字符JSON就明显少很多。去掉空白制表以及换行的话,JSON就是有用数据,而XML却包含很多重复的标记字符。
五、下面列举两个对象:JSONArray和JSONObject
在写有关于JSON的程序时首先要加入六个JAR包:commons-beanutils-1.7.0.jar、commons-
collections.jar、commons-lang-2.2.jar、ezmorph-1.0.4.jar、json-lib-2.1-
jdk15.jar、xom-1.1d2.jar

1、JSON定义以及JSON的特性

1.String转JSONObject

(1)JSONArray
     例子:
        List list = new ArrayList();
                list.add(“a”);
                list.add(“b”);
                JSONArray jso = JSONArray.fromObject(list);
                System.out.println(list);
        输出的结果是:[“a”,”b”] 。

2、如何在JavaScript中解释JSON格式数据

(1).

(2)JSONObject
     例子:
        Map map = new HashMap();
                map.put( “int”, new Integer(1) );     
                map.put( “arr”, new String[]{“a”,”b”} );     
                map.put( “func”, “function(i){ return this.arr; }” ); 
   
                JSONObject json = JSONObject.fromObject( map );     
                System.out.println( json );  
        输出的结果是:{“arr”:[“a”,”b”],”int”:1,”func”:function(i){
return this.arr
; }}

3、如何在Java代码中使用JSON(讲对象转换成JSON对象以及解释JSON字符串)

String jsonMessage =
“{“语文”:”88″,”数学”:”78″,”计算机”:”99″}”;

(3)JSONObject to XML
     例子:
         JSONObject json =
JSONObject.fromObject(“{“name”:”json”,”bool”:true,”int”:1}”);  
                   XMLSerializer xmlSerializer = new XMLSerializer(); 
 
           String xml = xmlSerializer.write(json);   
System.out.println(xml);

一、JSON

JSONObject  myJson =
JSONObject.fromObject(jsonMessage);

      XML to JSONObject
       例子:
            String xmls = “<?xml version=’1.0′
encoding=’UTF-8′?><o><int type=’number’>1</int>” + 
      “<name type=’string’>json</name></o>”;
                    XMLSerializer xmlSerializer = new XMLSerializer(); 
 
        JSON json = xmlSerializer.read(xmls); System.out.println(
json.toString(2) );

 
 w3c上对JSON有比较详细的介绍,链接.下面仅讲述重要的几点。

(2).用阿里巴巴的fastjson的jar包

六、下面列举AJAX和JSON的例子
    1、环境struts、hibernate、JSON、AJAX
    2、首先,加载struts和hibernate框架,然后再把JSON的JAR包放到lib下。
创建一个Action:
       Action的内容如下:

Json是 javascript
对象表示法(JavaScript Object Notation),是轻量级的文本数据交换格式,具有层级结构(值中存在值), 数据可使用
AJAX
进行传输,独立于语言,具有自我描述性,比XML更小更快更容易解析。JSON格式字符串转化为JavaScript对象无需解析器, JSON
使用 JavaScript
语法,使用JavaScript的eval()函数可生成JavaScript对象。

String str =
“{“baid”:null,”32d3:”:”null”,433:”0x32″,032:”ju9fw”}”;
com.alibaba.fastjson.JSONObject jm =
com.alibaba.fastjson.JSON.parseObject(str);

                    PrintWriter out = response.getWriter();
                 JSONObject obj = new JSONObject();
                 JSONArray js = new JSONArray();
                 //这里的数据封装是从数据库查询来的          
                  MesDao md = new MesDao();
                  List list = md.findMess();
                  for(int i=0;i<list.size();i++){
                        JSONObject objtemp = new JSONObject();
                        TMessage tm = (TMessage) list.get(i);
                               objtemp.put(“id”, tm.getId());
                        objtemp.put(“name”, tm.getName());
                        js.add(objtemp);
           }
                obj.put(“js”,js);
           out.print(obj.toString());
        然后,创建一个JSP页面:
        其内容如下:
        <script
type=”text/javascript”  src=”prototype1.4.js”></script>
        <script
type=”text/javascript”  src=”toolpro.js”></script>
        <script type=”text/javascript”>
          function demo(){
                new Ajax.Updater(“content”,”test.do”);           
          }
</script>
<a href=’javascript:getcomplex()’>获取数据</a>
<div id=”content”>
             正在获取内容…
</div>
然后创建toolpro.js
toolpro.js的内容如下:
function getcomplex(){
var url = ‘test.do’;
            var ajax = new Ajax.Request(url,
            {method:’post’,Complete:showcomplex});  
}
function showcomplex(dataResponse)
      {
var data = eval(‘(‘ + dataResponse.responseText + ‘)’);
var str=”;
for(var i=0;i<data.js.length;i++)
{
str+='<ul>’;
str+='<li>’+data.js.id+'</li>’;
str+='<li>’+data.js
.name+'</li>’;
str+='</ul>’;
}
document.getElementById(“content”).innerHTML=str;
}**

下面给出JSON格式的数据,非常清晰,无需多做解释,语法请阅读官方文档。

2.String转JSONArray

标准JSON格式数据

String jsonMessage = “[{‘num’:’成绩’,
‘外语’:88, ‘历史’:65, ‘地理’:99,
‘object’:{‘aaa’:’1111′,’bbb’:’2222′,’cccc’:’3333′}},” +
          “{‘num’:’兴趣’, ‘外语’:28, ‘历史’:45, ‘地理’:19,
‘object’:{‘aaa’:’11a11′,’bbb’:’2222′,’cccc’:’3333′}},” +
          “{‘num’:’爱好’, ‘外语’:48, ‘历史’:62, ‘地理’:39,
‘object’:{‘aaa’:’11c11′,’bbb’:’2222′,’cccc’:’3333′}}]”;
 JSONArray myJsonArray = JSONArray.fromObject(jsonMessage);
 System.out.println(myJsonArray);

{ "firstName":"John" , "lastName":"Doe" }

标准JSON格式数组数据

{"employees": [{ "firstName":"John" , "lastName":"Doe" },{ "firstName":"Anna" , "lastName":"Smith" },{ "firstName":"Peter" , "lastName":"Jones" }]}

3.String转Map

或直接赋值给变量:

(1)

var employees = [{ "firstName":"Bill" , "lastName":"Gates" },{ "firstName":"George" , "lastName":"Bush" },{ "firstName":"Thomas" , "lastName": "Carter" }];

String jsonMessage =
“{“语文”:”88″,”数学”:”78″,”计算机”:”99″}”;

二、在JavaScript中解释JSON数据

JSONObject  myJson =
JSONObject.fromObject(jsonMessage);

JSON
最常见的用法之一,是从 web 服务器上读取 JSON 数据(作为文件或作为
HttpRequest),将 JSON 数据转换为 JavaScript
对象,然后在网页中使用该数据。

Map m
= myJson; 

下面直接给出代码示例:

(2)用阿里巴巴的fastjson的jar包

[html] view
plain
copy

String str

“{“baid”:null,”32d3:”:”null”,433:”0x32″,032:”ju9fw”}”;
Map mapTypes = com.alibaba.fastjson.JSON.parseObject(str);

(3) (需要引入jackjson的core、databind、annotations三个jar包
 )

String json =
“{“PayPal key2″:”PayPal value2″,”PayPal key1″:”PayPal
value1″,”PayPal key3″:”PayPalvalue3″}”;  

ObjectMapper mapper =
new ObjectMapper();    
 Map<String,Object> m = mapper.readValue(json, Map.class);
 

(4)(特殊格式的String)

String a =”{se=2016,
format=xml, at=en co=3}”;

a =  a.substring(1,
a.length()-1);
Map docType = new HashMap();  
Java.util.StringTokenizer
items;  
for(StringTokenizer entrys = new StringTokenizer(a, “,
“);entrys.hasMoreTokens();   
docType.put(items.nextToken(), items.hasMoreTokens() ? ((Object)
(items.nextToken())) : null)){  
     items = new StringTokenizer(entrys.nextToken(), “=”);  
   }

 

4.JSONObject、JSONArray,Map转String

JSONObject——String:

System.out.println(myJsonObject);//可直接输出JSONObject的内容

myJsonObject.toString();

JSONArray——String:

System.out.println(myJsonArray);//可直接输出myJsonArray的内容

myJsonArray.toString();

Map——String:

System.out.println(map);//可直接输出map的内容

map.toString();

 

5.JSONObject转JSONArray

 

 

6.JSONObject转Map

JSONObject  myJson =
JSONObject.fromObject(jsonString);

Map m = myJson; 

 

7.JSONArray转JSONObject

  for(int i=0 ; i
< myJsonArray.length() ;i++)
   {
    //获取每一个JsonObject对象
    JSONObject myjObject =
myJsonArray.getJSONObject(i);

 

}

 

8.JSONArray转Map

 

 

9.Map转JSONObject

JSONObject json = JSONObject.fromObject(
map );   

 

10.Map转JSONArray

 
 JSONArray.fromObject(map);

11.List转JSONArray

JSONArray jsonArray2 = JSONArray.fromObject( list );      

 

12.JSONArray转List

List<Map<String,Object>> mapListJson = (List)jsonArray;

 

13.String转数组

String string =
“a,b,c”;
String [] stringArr= string.split(“,”);  //注意分隔符是需要转译滴…
如果是”abc”这种字符串,就直接
String string = “abc” ;
char [] stringArr = string.toCharArray(); //注意返回值是char数组
如果要返回byte数组就直接使用getBytes方法就ok了~~
String string = “abc” ;
byte [] stringArr = string.getBytes();

数组转String

char[]
data={a,b,c}; 
String s=new String(data); 

 

——————————————–js中—————————————

js中自定义的map请参考:

 

1.json转Map(并获取key和value)

var
str = JSON.stringify(json);

 str = ‘{ “10.10.11.1”:
{ “target_1”: “34.2”,”target_3″: “70.83”,”target_2″:
“50.51”}}’;
var map =
eval(“(“+str+”)”);

//以下为获取Map的key-value:
for (var key in map) {  
var a = map[key];
for (var k in
a) {  
alert(k+’—‘+a[k]);
}   
  }
 

参考:

 

2.Map转json:

不能直接map转json:var
mjson = JSON.parse(map);

也不能var mjson = $.parseJSON(map);//结果为null

只能分两步走:

var mstr =
JSON.stringify(map);

var jsonstr =
JSON.parse(mstr);

(注:有的浏览器不支持JSON.parse()方法,使用jQuery.parseJSON()方法时,在浏览器支持时会返回执行JSON.parse()方法的结果,否则会返回类似执行eval()方法的结果)

参考:http://www.jb51.net/article/87642.htm

3.json转String:

JSON.stringify(json);

 

4.String转json:

var
str = ‘{ “10.10.11.1”: { “target_1”: “34.2”,”target_3″:
“70.83”,”target_2″: “50.51”}}’;

var
jsonstr = JSON.parse(str);

 

5.Map转String:

var
mstr = JSON.stringify(map);

6.String转Map:

var
str = ‘{ “10.10.11.1”: { “target_1”: “34.2”,”target_3″:
“70.83”,”target_2″: “50.51”}}’;
var map = eval(“(“+str+”)”);

转至:

print?

  1. <pre name=”code” class=”html”><html>  
  2. <head>  
  3. </head>  
  4. <script type=”text/javascript”>  
  5. function  testjson(){  
  6.   
  7. //Json格式的字符串  
  8. var txt = ‘{ “employees” : [‘ +  
  9. ‘{ “firstName”:”Bill” , “lastName”:”Gates” },’ +  
  10. ‘{ “firstName”:”George” , “lastName”:”Bush” },’ +  
  11. ‘{ “firstName”:”Thomas” , “lastName”:”Carter” } ]}’;  
  12.   
  13. //使用eval函数转换成JSON对象  
  14. //eval() 函数使用的是 JavaScript 编译器,可解析 JSON 文本,然后生成 JavaScript 对象。必须把文本包围在括号中,这样才能避免语法错误:  
  15. var obj = eval (“(” + txt   
  16.     + “)”);  
  17. //通过对象名,然后根据数组下标以及属性名取值  
  18. alert(obj.employees[0].firstName);  
  19. }  
  20.   
  21. </script>  
  22. <body>  
  23.     <a href=”” onclick=”testjson()”>Click me!</a>  
  24. </body>  
  25. </html>  

        Click me!

直接保存为后缀名为html或htm的文件,用浏览器打开,就可以测试运行结果了。

三、Java操作JSON

1、Josn-lib

JSON-lib这个Java类包用于把bean,map和XML转换成JSON并能够把JSON转回成bean和DynaBean。

下载地址:

还要需要的第3方包:

rg.apache.commons(3.2以上版本)

org.apache.oronet.sf.

ezmorph(ezmorph-1.0.4.jar)

nu.xom

下面直接给出代码:

[java] view plain copy

print?

  1. package com.doyeden.json;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. import org.apache.commons.beanutils.PropertyUtils;  
  9.   
  10. import net.sf.json.JSONArray;  
  11. import net.sf.json.JSONObject;  
  12. import net.sf.json.xml.XMLSerializer;  
  13.   
  14. public class TestJson {  
  15.     public static void main(String[] args) {  
  16.   
  17.         // 1. List  
  18.         boolean[] booleanArray = new boolean[] { false, false, true, false };  
  19.         JSONArray ja = JSONArray.fromObject(booleanArray);  
  20.         System.err.println(ja);  
  21.   
  22.         List list = new ArrayList();  
  23.         list.add("first");  
  24.         list.add("second");  
  25.         JSONArray jsonArray2 = JSONArray.fromObject(list);  
  26.         System.out.println(jsonArray2);  
  27.   
  28.         JSONArray jsonArray3 = JSONArray.fromObject("['json','is','easy']");  
  29.         System.out.println(jsonArray3);  
  30.   
  31.         // 2. Map  
  32.         Map map = new HashMap();  
  33.         map.put("name", "json");  
  34.         map.put("bool", Boolean.TRUE);  
  35.         map.put("int", new Integer(1));  
  36.         map.put("arr", new String[] { "a", "b" });  
  37.         map.put("func", "function(i){ return this.arr[i]; }");  
  38.         JSONObject json = JSONObject.fromObject(map);  
  39.         System.out.println(json);  
  40.   
  41.         // 3. JSON Bean  
  42.         JSONObject jsonObject = JSONObject.fromObject(new JsonBean("kevin",  
  43.                 "Male"));  
  44.         System.out.println(jsonObject);  
  45.   
  46.         // 4. Json Beans  
  47.         List<JsonBean> lbs = new ArrayList<JsonBean>();  
  48.         JsonBean j1 = new JsonBean("kevin", "Male");  
  49.         JsonBean j2 = new JsonBean("maimai", "Femal");  
  50.         lbs.add(j1);  
  51.         lbs.add(j2);  
  52.         JSONArray ja_beans = JSONArray.fromObject(lbs);  
  53.         System.out.println(ja_beans);  
  54.   
  55.     }  
  56. }  

    package com.doyeden.json;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import org.apache.commons.beanutils.PropertyUtils;import net.sf.json.JSONArray;import net.sf.json.JSONObject;import net.sf.json.xml.XMLSerializer;public class TestJson { public static void main(String[] args) { // 1. List boolean[] booleanArray = new boolean[] { false, false, true, false }; JSONArray ja = JSONArray.fromObject(booleanArray); System.err.println(ja); List list = new ArrayList(); list.add("first"); list.add("second"); JSONArray jsonArray2 = JSONArray.fromObject(list); System.out.println(jsonArray2); JSONArray jsonArray3 = JSONArray.fromObject("['json','is','easy']"); System.out.println(jsonArray3); // 2. Map Map map = new HashMap(); map.put("name", "json"); map.put("bool", Boolean.TRUE); map.put("int", new Integer(1)); map.put("arr", new String[] { "a", "b" }); map.put("func", "function(i){ return this.arr[i]; }"); JSONObject json = JSONObject.fromObject(map); System.out.println(json); // 3. JSON Bean JSONObject jsonObject = JSONObject.fromObject(new JsonBean("kevin", "Male")); System.out.println(jsonObject); // 4. Json Beans List lbs = new ArrayList(); JsonBean j1 = new JsonBean("kevin", "Male"); JsonBean j2 = new JsonBean("maimai", "Femal"); lbs.add(j1); lbs.add(j2); JSONArray ja_beans = JSONArray.fromObject(lbs); System.out.println(ja_beans); }}

下面的类的get和set方法必须有才可以

[java] view plain copy

print?

  1. package com.doyeden.json;  
  2.   
  3. public class JsonBean {  
  4.     private String name;  
  5.     private String sex;  
  6.       
  7.     public JsonBean() {  
  8.         super();  
  9.     }  
  10.     public JsonBean(String name, String sex) {  
  11.         super();  
  12.         this.name = name;  
  13.         this.sex = sex;  
  14.     }  
  15.     public String getName() {  
  16.         return name;  
  17.     }  
  18.     public void setName(String name) {  
  19.         this.name = name;  
  20.     }  
  21.     public String getSex() {  
  22.         return sex;  
  23.     }  
  24.     public void setSex(String sex) {  
  25.         this.sex = sex;  
  26.     }  
  27.       
  28. }  

    package com.doyeden.json;public class JsonBean { private String name; private String sex; public JsonBean() { super(); } public JsonBean(String name, String sex) { super(); this.name = name; this.sex = sex; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }

程序运行结果:

[java] view plain copy

print?

  1. [false,false,true,false]  
  2. ["first","second"]  
  3. ["json","is","easy"]  
  4. {"arr":["a","b"],"int":1,"name":"json","func":function(i){ return this.arr[i]; },"bool":true}  
  5. {"name":"kevin","sex":"Male"}  
  6. [{"name":"kevin","sex":"Male"},{"name":"maimai","sex":"Femal"}]  

    [false,false,true,false]["first","second"]["json","is","easy"]{"arr":["a","b"],"int":1,"name":"json","func":function(i){ return this.arr[i]; },"bool":true}{"name":"kevin","sex":"Male"}[{"name":"kevin","sex":"Male"},{"name":"maimai","sex":"Femal"}]

2、 目前比较流行的fast-json解析 ,更多fast-json请自行查阅文档

阿里巴巴FastJson是一个Json处理工具包,包括“序列化”和“反序列化”两部分,它具备如下特征:
速度最快,测试表明,fastjson具有极快的性能,超越任其他的JavaJson parser。包括自称最快的JackJson;
功能强大,完全支持javaBean、集合、Map、日期、Enum,支持范型,支持自省;无依赖,能够直接运行在

Java SE 5.0以上版本;支持Android;开源 (Apache 2.0)

Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。

public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArray 
public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject    
public static final  T parseObject(String text, Class clazz); // 把JSON文本parse为JavaBean 
public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray 
public static final  List parseArray(String text, Class clazz); //把JSON文本parse成JavaBean集合 
public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本 
public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本 
public static final Object toJSON(Object javaObject); 将JavaBean转换为JSONObject或者JSONArray。

  实例代码:

(需要导入fastjson的jar包)

[java] view plain copy

print?

  1. package com.doyeden.json.fastjson;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import com.alibaba.fastjson.JSON;  
  7. import com.doyeden.json.JsonBean;  
  8.   
  9. public class Test {  
  10.     public static void main(String[] args) {  
  11.           
  12.         //1 parse bean to json text  
  13.         JsonBean jb=new JsonBean("kevin","Male");  
  14.         System.out.println(JSON.toJSONString(jb));  
  15.           
  16.         //2 parse list to json array  
  17.         List<JsonBean> ljs=new ArrayList<JsonBean>();  
  18.         JsonBean jb1=new JsonBean("kevin","Male");  
  19.         JsonBean jb2=new JsonBean("maimai","Female");  
  20.         ljs.add(jb2);  
  21.         ljs.add(jb1);  
  22.         System.out.println(JSON.toJSONString(ljs));  
  23.           
  24.         //3 parse json text to bean  
  25.         String s="{"name":"greg","sex":"Male"}";  
  26.         JSON jO=JSON.parseObject(s);  
  27.         JsonBean j=JSON.toJavaObject(jO, JsonBean.class);  
  28.         System.out.println(j.getName());  
  29.           
  30.     }  
  31. }  

    package com.doyeden.json.fastjson;import java.util.ArrayList;import java.util.List;import com.alibaba.fastjson.JSON;import com.doyeden.json.JsonBean;public class Test { public static void main(String[] args) { //1 parse bean to json text JsonBean jb=new JsonBean("kevin","Male"); System.out.println(JSON.toJSONString(jb)); //2 parse list to json array List ljs=new ArrayList(); JsonBean jb1=new JsonBean("kevin","Male"); JsonBean jb2=new JsonBean("maimai","Female"); ljs.add(jb2); ljs.add(jb1); System.out.println(JSON.toJSONString(ljs)); //3 parse json text to bean String s="{"name":"greg","sex":"Male"}"; JSON jO=JSON.parseObject(s); JsonBean j=JSON.toJavaObject(jO, JsonBean.class); System.out.println(j.getName()); }}

结果:

{"name":"kevin","sex":"Male"}
[{"name":"maimai","sex":"Female"},{"name":"kevin","sex":"Male"}]
greg

3、其他方式,例如 org-lib等,使用方法跟上述两种方式非常相似。就不做更多介绍了。个人推荐还是使用fast-json。

总结:本文讲述了JSON格式数据以及如何在JavaScript和Java代码中操作JSON格式数据,可以发现,因为JSON自解释性,轻量级,体积小,跨平台等特点,JSON格式数据非常适合作为和后端数据交互的格式。JavaScript本身就可以解释JSON,这样就省去了很多第三方库,java中,关于讲JSON转换成Java对象以及讲Java对象和对象数组转换成JSON格式数据的类库其实有很多,但是目前来说最快的是fastjson.

转自:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图