先看效果图
主要代码
package com.example.gson; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import android.app.Activity; import android.os.Bundle; import android.text.Spanned; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv = (TextView) findViewById(R.id.tv); TextView jsonTv=(TextView) findViewById(R.id.jsonTv); EditText editText = (EditText) findViewById(R.id.edittext); String json = "{\"nickname\":\"xiaoming\",\"age\":10,\"emoj\":\"[:f001}[:f002}[:f003}hello[:f004}[:f005}\"}"; jsonTv.setText(json); Gson gson = new GsonBuilder().registerTypeAdapter(Spanned.class, new String2Spanned()).create(); Person person = gson.fromJson(json, Person.class); editText.append(person.getNickname()); editText.append(" "); editText.append(person.getAge() + " "); editText.append(person.getEmoj()); tv.append(Spanned2String.parse(editText.getText())); } }
package com.example.gson; import android.text.Spanned; public class Person { private Spanned emoj; private String nickname; private int age; public Spanned getEmoj() { return emoj; } public void setEmoj(Spanned emoj) { this.emoj = emoj; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
package com.example.gson; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.example.gson.application.MyApplication; import com.google.gson.TypeAdapter; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonToken; import com.google.gson.stream.JsonWriter; import android.graphics.drawable.Drawable; import android.provider.Settings.Global; import android.text.Html; import android.text.Html.ImageGetter; import android.text.SpannableString; import android.text.Spanned; /** * 字符串转表情Spanned 表情格式 [:f000} * * @author Young * */ public class String2Spanned extends TypeAdapter<Spanned> { static Pattern pattern; static Map<String, Integer> map = new HashMap<String, Integer>(); static ImageGetter imageGetter = new ImageGetter() { @Override public Drawable getDrawable(String source) { int id = Integer.parseInt(source); Drawable d = MyApplication.application.getResources().getDrawable(id); d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); return d; } }; static { pattern = Pattern.compile("\\[:f\\d{3}\\}"); map.put("[:f000}", R.drawable.f000); map.put("[:f001}", R.drawable.f001); map.put("[:f002}", R.drawable.f002); map.put("[:f003}", R.drawable.f003); map.put("[:f004}", R.drawable.f004); map.put("[:f005}", R.drawable.f005); map.put("[:f006}", R.drawable.f006); map.put("[:f007}", R.drawable.f007); map.put("[:f008}", R.drawable.f008); map.put("[:f009}", R.drawable.f009); map.put("[:f010}", R.drawable.f010); map.put("[:f011}", R.drawable.f011); map.put("[:f012}", R.drawable.f012); map.put("[:f013}", R.drawable.f013); map.put("[:f014}", R.drawable.f014); map.put("[:f015}", R.drawable.f015); map.put("[:f016}", R.drawable.f016); map.put("[:f017}", R.drawable.f017); map.put("[:f018}", R.drawable.f018); map.put("[:f019}", R.drawable.f019); map.put("[:f020}", R.drawable.f020); map.put("[:f021}", R.drawable.f021); map.put("[:f022}", R.drawable.f022); map.put("[:f023}", R.drawable.f023); map.put("[:f024}", R.drawable.f024); map.put("[:f025}", R.drawable.f025); map.put("[:f026}", R.drawable.f026); map.put("[:f027}", R.drawable.f027); map.put("[:f028}", R.drawable.f028); map.put("[:f029}", R.drawable.f029); map.put("[:f030}", R.drawable.f030); map.put("[:f031}", R.drawable.f031); map.put("[:f032}", R.drawable.f032); map.put("[:f033}", R.drawable.f033); map.put("[:f034}", R.drawable.f034); map.put("[:f035}", R.drawable.f035); map.put("[:f036}", R.drawable.f036); map.put("[:f037}", R.drawable.f037); map.put("[:f038}", R.drawable.f038); map.put("[:f039}", R.drawable.f039); map.put("[:f040}", R.drawable.f040); map.put("[:f041}", R.drawable.f041); map.put("[:f042}", R.drawable.f042); map.put("[:f043}", R.drawable.f043); map.put("[:f044}", R.drawable.f044); map.put("[:f045}", R.drawable.f045); map.put("[:f046}", R.drawable.f046); map.put("[:f047}", R.drawable.f047); map.put("[:f048}", R.drawable.f048); map.put("[:f049}", R.drawable.f049); map.put("[:f050}", R.drawable.f050); map.put("[:f051}", R.drawable.f051); map.put("[:f052}", R.drawable.f052); map.put("[:f053}", R.drawable.f053); map.put("[:f054}", R.drawable.f054); map.put("[:f055}", R.drawable.f055); map.put("[:f056}", R.drawable.f056); map.put("[:f057}", R.drawable.f057); map.put("[:f058}", R.drawable.f058); map.put("[:f059}", R.drawable.f059); map.put("[:f060}", R.drawable.f060); map.put("[:f061}", R.drawable.f061); map.put("[:f062}", R.drawable.f062); map.put("[:f063}", R.drawable.f063); map.put("[:f064}", R.drawable.f064); map.put("[:f065}", R.drawable.f065); map.put("[:f066}", R.drawable.f066); map.put("[:f067}", R.drawable.f067); map.put("[:f068}", R.drawable.f068); map.put("[:f069}", R.drawable.f069); map.put("[:f070}", R.drawable.f070); map.put("[:f071}", R.drawable.f071); map.put("[:f072}", R.drawable.f072); map.put("[:f073}", R.drawable.f073); map.put("[:f074}", R.drawable.f074); map.put("[:f075}", R.drawable.f075); map.put("[:f076}", R.drawable.f076); map.put("[:f077}", R.drawable.f077); map.put("[:f078}", R.drawable.f078); map.put("[:f079}", R.drawable.f079); map.put("[:f080}", R.drawable.f080); map.put("[:f081}", R.drawable.f081); map.put("[:f082}", R.drawable.f082); map.put("[:f083}", R.drawable.f083); map.put("[:f084}", R.drawable.f084); map.put("[:f085}", R.drawable.f085); map.put("[:f086}", R.drawable.f086); map.put("[:f087}", R.drawable.f087); map.put("[:f088}", R.drawable.f088); map.put("[:f089}", R.drawable.f089); map.put("[:f090}", R.drawable.f090); map.put("[:f091}", R.drawable.f091); } @Override public Spanned read(JsonReader in) throws IOException { if (in.peek() == JsonToken.NULL) { in.nextNull(); return null; } String origStr = in.nextString(); Matcher matcher = pattern.matcher(origStr); StringBuilder stringBuilder = new StringBuilder(); int last = 0; while (matcher.find()) { int s = matcher.start(); int e = matcher.end(); stringBuilder.append(origStr.substring(last, s)); String group = matcher.group(); Integer emojId = map.get(group); if (emojId == null) { stringBuilder.append(group); } else { stringBuilder.append("<img src='"); stringBuilder.append(emojId); stringBuilder.append("'/>"); } last = e; } stringBuilder.append(origStr.substring(last, origStr.length())); // String ss = "<img src='" + R.drawable.ic_launcher + "'/>"; return Html.fromHtml(stringBuilder.toString(), imageGetter, null); } @Override public void write(JsonWriter arg0, Spanned arg1) throws IOException { } }
import java.net.URLDecoder; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.lang.StringEscapeUtils; import com.itboye.sunsun.R; import com.itboye.sunsun.application.App; import android.text.Html; import android.text.Spanned; /** * 表情转 字符串 * @author Young * */ public class Spanned2String { // <p dir="ltr"><img src="2130837782"><img src="2130837783"></p> // <p dir="ltr">hello</p> static Pattern pattern; static Map<String,String>map=new HashMap<>(); static{ pattern=Pattern.compile("<img src=\"\\d+\">"); map.put(String.valueOf(R.drawable.f000) , "[:f000}"); map.put(String.valueOf(R.drawable.f001) , "[:f001}"); map.put(String.valueOf(R.drawable.f002) , "[:f002}"); map.put(String.valueOf(R.drawable.f003) , "[:f003}"); map.put(String.valueOf(R.drawable.f004) , "[:f004}"); map.put(String.valueOf(R.drawable.f005) , "[:f005}"); map.put(String.valueOf(R.drawable.f006) , "[:f006}"); map.put(String.valueOf(R.drawable.f007) , "[:f007}"); map.put(String.valueOf(R.drawable.f008) , "[:f008}"); map.put(String.valueOf(R.drawable.f009) , "[:f009}"); map.put(String.valueOf(R.drawable.f010) , "[:f010}"); map.put(String.valueOf(R.drawable.f011) , "[:f011}"); map.put(String.valueOf(R.drawable.f012) , "[:f012}"); map.put(String.valueOf(R.drawable.f013) , "[:f013}"); map.put(String.valueOf(R.drawable.f014) , "[:f014}"); map.put(String.valueOf(R.drawable.f015) , "[:f015}"); map.put(String.valueOf(R.drawable.f016) , "[:f016}"); map.put(String.valueOf(R.drawable.f017) , "[:f017}"); map.put(String.valueOf(R.drawable.f018) , "[:f018}"); map.put(String.valueOf(R.drawable.f019) , "[:f019}"); map.put(String.valueOf(R.drawable.f020) , "[:f020}"); map.put(String.valueOf(R.drawable.f021) , "[:f021}"); map.put(String.valueOf(R.drawable.f022) , "[:f022}"); map.put(String.valueOf(R.drawable.f023) , "[:f023}"); map.put(String.valueOf(R.drawable.f024) , "[:f024}"); map.put(String.valueOf(R.drawable.f025) , "[:f025}"); map.put(String.valueOf(R.drawable.f026) , "[:f026}"); map.put(String.valueOf(R.drawable.f027) , "[:f027}"); map.put(String.valueOf(R.drawable.f028) , "[:f028}"); map.put(String.valueOf(R.drawable.f029) , "[:f029}"); map.put(String.valueOf(R.drawable.f030) , "[:f030}"); map.put(String.valueOf(R.drawable.f031) , "[:f031}"); map.put(String.valueOf(R.drawable.f032) , "[:f032}"); map.put(String.valueOf(R.drawable.f033) , "[:f033}"); map.put(String.valueOf(R.drawable.f034) , "[:f034}"); map.put(String.valueOf(R.drawable.f035) , "[:f035}"); map.put(String.valueOf(R.drawable.f036) , "[:f036}"); map.put(String.valueOf(R.drawable.f037) , "[:f037}"); map.put(String.valueOf(R.drawable.f038) , "[:f038}"); map.put(String.valueOf(R.drawable.f039) , "[:f039}"); map.put(String.valueOf(R.drawable.f040) , "[:f040}"); map.put(String.valueOf(R.drawable.f041) , "[:f041}"); map.put(String.valueOf(R.drawable.f042) , "[:f042}"); map.put(String.valueOf(R.drawable.f043) , "[:f043}"); map.put(String.valueOf(R.drawable.f044) , "[:f044}"); map.put(String.valueOf(R.drawable.f045) , "[:f045}"); map.put(String.valueOf(R.drawable.f046) , "[:f046}"); map.put(String.valueOf(R.drawable.f047) , "[:f047}"); map.put(String.valueOf(R.drawable.f048) , "[:f048}"); map.put(String.valueOf(R.drawable.f049) , "[:f049}"); map.put(String.valueOf(R.drawable.f050) , "[:f050}"); map.put(String.valueOf(R.drawable.f051) , "[:f051}"); map.put(String.valueOf(R.drawable.f052) , "[:f052}"); map.put(String.valueOf(R.drawable.f053) , "[:f053}"); map.put(String.valueOf(R.drawable.f054) , "[:f054}"); map.put(String.valueOf(R.drawable.f055) , "[:f055}"); map.put(String.valueOf(R.drawable.f056) , "[:f056}"); map.put(String.valueOf(R.drawable.f057) , "[:f057}"); map.put(String.valueOf(R.drawable.f058) , "[:f058}"); map.put(String.valueOf(R.drawable.f059) , "[:f059}"); map.put(String.valueOf(R.drawable.f060) , "[:f060}"); map.put(String.valueOf(R.drawable.f061) , "[:f061}"); map.put(String.valueOf(R.drawable.f062) , "[:f062}"); map.put(String.valueOf(R.drawable.f063) , "[:f063}"); map.put(String.valueOf(R.drawable.f064) , "[:f064}"); map.put(String.valueOf(R.drawable.f065) , "[:f065}"); map.put(String.valueOf(R.drawable.f066) , "[:f066}"); map.put(String.valueOf(R.drawable.f067) , "[:f067}"); map.put(String.valueOf(R.drawable.f068) , "[:f068}"); map.put(String.valueOf(R.drawable.f069) , "[:f069}"); map.put(String.valueOf(R.drawable.f070) , "[:f070}"); map.put(String.valueOf(R.drawable.f071) , "[:f071}"); map.put(String.valueOf(R.drawable.f072) , "[:f072}"); map.put(String.valueOf(R.drawable.f073) , "[:f073}"); map.put(String.valueOf(R.drawable.f074) , "[:f074}"); map.put(String.valueOf(R.drawable.f075) , "[:f075}"); map.put(String.valueOf(R.drawable.f076) , "[:f076}"); map.put(String.valueOf(R.drawable.f077) , "[:f077}"); map.put(String.valueOf(R.drawable.f078) , "[:f078}"); map.put(String.valueOf(R.drawable.f079) , "[:f079}"); map.put(String.valueOf(R.drawable.f080) , "[:f080}"); map.put(String.valueOf(R.drawable.f081) , "[:f081}"); map.put(String.valueOf(R.drawable.f082) , "[:f082}"); map.put(String.valueOf(R.drawable.f083) , "[:f083}"); map.put(String.valueOf(R.drawable.f084) , "[:f084}"); map.put(String.valueOf(R.drawable.f085) , "[:f085}"); map.put(String.valueOf(R.drawable.f086) , "[:f086}"); map.put(String.valueOf(R.drawable.f087) , "[:f087}"); map.put(String.valueOf(R.drawable.f088) , "[:f088}"); map.put(String.valueOf(R.drawable.f089) , "[:f089}"); map.put(String.valueOf(R.drawable.f090) , "[:f090}"); map.put(String.valueOf(R.drawable.f091) , "[:f091}"); } public static String parse(Spanned spanned ) { try { String origHtml= Html.toHtml(spanned); String origStr=origHtml.substring(13, origHtml.length()-5); origStr=StringEscapeUtils.unescapeHtml(origStr);//html 汉字实体编码转换 Matcher matcher=pattern.matcher(origStr); // <img src="2130837782">hello<img src="2130837783"> StringBuilder stringBuilder=new StringBuilder(); int last=0; while (matcher.find()) { int s= matcher.start(); int e=matcher.end(); stringBuilder.append(origStr.substring( last,s)); String group=matcher.group(); String id=group.substring(10, group.length()-2); String emojStr=map.get(id); if (emojStr==null) { stringBuilder.append(group); }else{ stringBuilder.append(emojStr); } last=e; } stringBuilder.append(origStr.substring(last, origStr.length())); return stringBuilder.toString(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); return ""; } } }
工程代码 (需要下载org.apache.commons.lang.jar包 )
链接:http://pan.baidu.com/s/1nuWgDFr 密码:22dx