惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
News | PayPal Newsroom
P
Proofpoint News Feed
Cyberwarzone
Cyberwarzone
C
Cisco Blogs
SecWiki News
SecWiki News
Know Your Adversary
Know Your Adversary
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Vercel News
Vercel News
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
罗磊的独立博客
NISL@THU
NISL@THU
WordPress大学
WordPress大学
Hacker News - Newest:
Hacker News - Newest: "LLM"
T
Threat Research - Cisco Blogs
AI
AI
Simon Willison's Weblog
Simon Willison's Weblog
Security Archives - TechRepublic
Security Archives - TechRepublic
有赞技术团队
有赞技术团队
L
LINUX DO - 热门话题
Hacker News: Ask HN
Hacker News: Ask HN
V
V2EX
G
GRAHAM CLULEY
TaoSecurity Blog
TaoSecurity Blog
Hugging Face - Blog
Hugging Face - Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
F
Fortinet All Blogs
博客园 - 叶小钗
博客园 - 三生石上(FineUI控件)
云风的 BLOG
云风的 BLOG
Recorded Future
Recorded Future
Latest news
Latest news
The Hacker News
The Hacker News
aimingoo的专栏
aimingoo的专栏
T
Troy Hunt's Blog
S
Schneier on Security
I
Intezer
Google DeepMind News
Google DeepMind News
A
Arctic Wolf
Apple Machine Learning Research
Apple Machine Learning Research
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Threatpost
爱范儿
爱范儿
The Register - Security
The Register - Security
S
SegmentFault 最新的问题
Blog — PlanetScale
Blog — PlanetScale
博客园 - 聂微东
宝玉的分享
宝玉的分享
Recent Commits to openclaw:main
Recent Commits to openclaw:main
美团技术团队
B
Blog RSS Feed

博客园 - my favorite

【转】QT样式表 (QStyleSheet) 【转】Qt事件循环与线程 二 [转]Qt 智能指针学习 【转】Android Web Server 【转】Android Http Server Java Annotation 注释语法 JavaScript定义类的几种方式 js获取浏览器高度和宽度值(多浏览器) Setting up SSL made easy… Better, Faster, Easier SSL testing for ASP.NET MVC & WebForms ASP.NET MVC 3 Internationalization Windows 8 学习笔记(十四)--.map文件与.kml文件的解析 Windows 8学习笔记(十二)--集合控件 Windows 8 学习笔记(十三)--生命周期 Windows 8学习笔记(十一)---图片的显示与保存 Windows 8 Metro App学习笔记(九)—磁砖 Windows 8学习笔记(十)----Notification Windows 8 学习笔记(八)--各种流之间的转换 Windows 8学习笔记(七)--Input输入设备
android中json的序列化与反序列化
my favorite · 2012-08-30 · via 博客园 - my favorite

最近项目中需要在android中将对象转为json字串以及反序列化为对象,查阅了android sdk文档后,发现android中没有类似C#里DataContractJsonSerializer的类,想想需求也不算复杂,就自己写了两个方法解决,代码如下:

public static String getJson(Object objSource){
        try{
            Object object = getJsonObject(objSource);
            if(object == null)
                return "";
            return ((JSONObject)object).toString();
        }catch(Exception err){
            Log.e(TAG, "getJson exception:"+err.getMessage());
            return "";
        }
    }
    
    private static Object getJsonObject(Object objSource) throws Exception{
        if(objSource != null){            
            Class<?> objClass = objSource.getClass();
            if(objClass.getPackage().getName().startsWith(PackageString)){
                JSONObject jsonObject = new JSONObject();
                Field[] publicFields = objClass.getFields();
                Object val;            
                for(Field field : publicFields){
                    val = field.get(objSource);
                    if(val != null){    
                        Class<?> valClass = val.getClass();
                        if(valClass.isArray()){
                            JSONArray array = new JSONArray();
                            int length = Array.getLength(val);
                            for(int i = 0; i<length; i++){
                                array.put(getJsonObject(Array.get(val, i)));
                            }
                            jsonObject.put(field.getName(), array);
                        }else if(valClass.equals(ArrayList.class)){
                            ArrayList<?> aList = ArrayList.class.cast(val);
                            Iterator<?> iterator = aList.iterator();
                            JSONArray array = new JSONArray();
                            while (iterator.hasNext()) {
                                array.put(getJsonObject(iterator.next()));                                
                            }
                            jsonObject.put(field.getName(), array);
                        }else{
                            jsonObject.put(field.getName(),getJsonObject(val));
                        }
                    }else{
                        jsonObject.put(field.getName(), null);
                    }                
                }
                return jsonObject;
            }else{
                return objSource;
            }
        }
        return null;
    }
    
    
    public static Object parseJson(Class<?> targetClass,String jsonString){
        try{
            Object object = targetClass.newInstance();
            JSONObject jsonObject = new JSONObject(jsonString);
            String key;
            Class<?> fieldClass;
            Object element;
            Class<?> elementType;
            Field[] fields = targetClass.getFields();
            
            for(Field field : fields){
                
                key = field.getName();
                fieldClass = field.getType();
                if(fieldClass.equals(ArrayList.class)){
                    String genericType = field.getGenericType().toString();
                    if(genericType.indexOf("<") > 0){
                        genericType = genericType.substring(genericType.indexOf("<")+1,genericType.lastIndexOf(">"));    
                    }
                    ArrayList<Object> aList = new ArrayList<Object>();
                    JSONArray array = jsonObject.getJSONArray(key);
                    int length = array.length();
                    if(genericType.startsWith(PackageString)){
                        elementType = Class.forName(genericType);
                        Field[] elementFields = elementType.getFields();
                        JSONObject subJsonObject;
                        for(int i=0;i<length;i++){
                            element = elementType.newInstance();
                            subJsonObject = array.getJSONObject(i);
                            for(Field subField : elementFields){
                                subField.set(element, subJsonObject.get(subField.getName()));
                            }
                            aList.add(element);                        
                        }
                    }else{
                        for(int i=0;i<length;i++){
                            aList.add(array.get(i));
                        }
                    }
                    field.set(object, aList);
                    
                }else if(fieldClass.isArray()){
                    JSONArray array = jsonObject.getJSONArray(key);
                    int length = array.length();
                    String arrayTypeName = fieldClass.getComponentType().getName();
                    Object[] objArray = new Object[length];
                     
                    if(arrayTypeName.startsWith(PackageString)){
                        elementType = Class.forName(arrayTypeName);
                        Field[] elementFields = elementType.getFields();
                        JSONObject subJsonObject;
                        for(int i=0;i<length;i++){
                            element = elementType.newInstance();
                            subJsonObject = array.getJSONObject(i);
                            for(Field subField : elementFields){
                                subField.set(element, subJsonObject.get(subField.getName()));
                            }
                            objArray[i] = element;                        
                        }
                    }else{
                        for(int i=0;i<length;i++){
                            objArray[i] = array.get(i);
                        }
                    }
                    field.set(object, objArray);
                    
                }else{
                    field.set(object, jsonObject.get(key));
                }
            }
            return object;
        }catch(Exception err){
            Log.e(TAG, "parseJson exception:"+err.getMessage());
            return null;
        }
    }

 支持基本类型、数组、ArrayList成员组成的类