关于json解析

原创 2016年05月31日 00:02:29

本篇博客主要记录如何将一个类转化为json时,按指定需要转化一些属性。
例如:有如下一个类

public static class EMojElement {
        private float fontSize;
        private int fontAlign;
        private int type;
        private boolean borderArrow;
        private int borderStyle;
        private int font;
        private String text;
        public String imageurl;

        public Frame frame;
        public Transform_flip transform_flip;
        public Transform transform;

        public BorderColor borderColor;
        public FontColor fontColor;
}

然后服务器返回如下一段json

{
    "id":"emoji_1AC97CE2-A264-4848-9A81-8B609327A1F6",
    "emojiElements":[
        {
            "type":2001,
            "frame":{
                "y":99.66742,
                "width":106.8228,
                "x":99.11677,
                "height":119.8278
            },
            "transform":{
                "d":0.9999757,
                "b":0.006961379,
                "ty":0,
                "c":-0.006961379,
                "a":0.9999757,
                "tx":0
            },
            "transform_flip":{
                "d":1,
                "b":0,
                "ty":0,
                "c":0,
                "a":1,
                "tx":0
            }
        },
        {
            "fontSize":24.74611,
            "frame":{
                "y":44.26067,
                "width":138.3485,
                "x":87.0689,
                "height":55.5
            },
            "fontAlign":1,
            "fontColor":{
                "r":0.3411765,
                "b":0.1764706,
                "g":0,
                "a":1
            },
            "type":1001,
            "borderArrow":true,
            "font":1,
            "text":"静静的看着你XX",
            "borderColor":{
                "r":1,
                "b":1,
                "g":1,
                "a":1
            },
            "transform":{
                "d":0.9998971,
                "b":0.01434911,
                "ty":0,
                "c":-0.01434911,
                "a":0.9998971,
                "tx":0
            },
            "borderStyle":1,
            "transform_flip":{
                "d":1,
                "b":0,
                "ty":0,
                "c":0,
                "a":1,
                "tx":0
            }
        }
    ]
}

你会发现同一个同一个json中一个object只有四个属性,另一个object一个有十几个属性,解析这样一段json并不困难,设置一个
@JsonIgnoreProperties(ignoreUnknown = true)
就可以轻松解决。
但是如果需求是:你要上传一个类似的json到服务器,就有点麻烦了。
上面的类中有个type属性,假如type =1001时代表一个textview,需要所有的属性值,type = 2001时代表一个imageview,只需要四个属性值。

如果是用如下的方式,必定会有多余的参数:

EMojElement emElement = new EMojElement();      
            // frame
            Frame frame = new Frame();
            frame.setX(rectF.left / density);
            frame.setY(rectF.top / density);
            frame.setWidth((rectF.right - rectF.left) / density);
            frame.setHeight((rectF.bottom - rectF.top) / density);
            emElement.setFrame(frame);

一般如果按照这个方式来设置属性值,即使你只为imageview设置了四个属性,使用gson.toJson方法同样会将有值的参数添加到json中(基本数据类型会默认赋值0,包装类设置为null就不会解析到json中,但是这样做不合适,EMojElement 是以其他类作为一个属性,赋值null也不会解析到json中)。

解决方案:使用Map(这只是我目前使用的解决方案)

List<Map<String, Object>> bitMaps = new ArrayList<Map<String, Object>>();

Map<String, Object> map = new HashMap<String, Object>();
            // frame
            Frame frame = new Frame();
            frame.setX(rectF.left / density);
            frame.setY(rectF.top / density);
            frame.setWidth((rectF.right - rectF.left) / density);
            frame.setHeight((rectF.bottom - rectF.top) / density);
            map.put("frame", frame);
            //你所需要的其他的属性,可以逐一在这里添加,然后将整个map作为一个对象,放入bitmaps集合中
            bitMaps.add(map);

使用map对象来代替之前的emElement 对象,可以使指定参数转化成json很好的实现。

public static void getImageJson(List<ElementsItem.EMojElement> emList,
            List<Map<String, Object>> bitMaps,
            ImageViewDrawableOverlay mImageView, List<String> urList,
            Context context) {
        // 为保持一致,获取的大小都除以屏幕密度,用1为标准
        float density = ZTDeviceUtil.getDensity(context);


        for (int i = 0; i < mImageView.getmOverlayViews().size(); i++) {
            ElementsItem.EMojElement emElement = new ElementsItem.EMojElement();
            Map<String, Object> map = new HashMap<String, Object>();
            // frame
            RectF rectF = mImageView.getmOverlayViews().get(i).computeLayout();
            Frame frame = new Frame();
            frame.setX(rectF.left / density);
            frame.setY(rectF.top / density);
            frame.setWidth((rectF.right - rectF.left) / density);
            frame.setHeight((rectF.bottom - rectF.top) / density);
            emElement.setFrame(frame);
            map.put("frame", frame);

            emElement.imageurl = urList.get(i);
            // tarnsform -- 旋转的角度
            float rotation = mImageView.getmOverlayViews().get(i).getRotation();
            Transform transform = new Transform();
            transform.setD((float) Math.cos(rotation));
            transform.setB((float) Math.sin(rotation));
            transform.setC(-(float) Math.sin(rotation));
            transform.setA((float) Math.cos(rotation));
            transform.setTx(0f);
            transform.setTy(0f);
            emElement.setTransform(transform);
            map.put("transform", transform);

            // transform_flip -- 对称变换,变换d\a
            Transform_flip transform_flip = new Transform_flip();
            int ltr = mImageView.getmOverlayViews().get(i).getLeftToRight();
            int utd = mImageView.getmOverlayViews().get(i).getUpToDown();
            transform_flip.setD(utd);
            transform_flip.setB(0);
            transform_flip.setC(0);
            transform_flip.setA(ltr);
            transform_flip.setTx(0);
            transform_flip.setTy(0);
            emElement.setTransform_flip(transform_flip);
            map.put("transform_flip", transform_flip);

            // 设置类型
            emElement.setType(2001);
            map.put("type", 2001);

            // 添加到集合中
            emList.add(emElement);
            bitMaps.add(map);
        }
    }

这里使用了两种方式来获取要转化为json的对象集合,都可以满足转化为json的要求,并且map方式转化的json只有在这里设置了的,其余没有设置的,即使有默认值,也不会转化到json中。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wudu1227/article/details/51542269

图片的base64码,添加到json字符串中,用JSON.parse()解析失败

var i=JSON.parse("{\"card1\":\""+card1+"\"}") 上面的card1是通过读取图片得到的base64的编码:如 data:image/jpeg;base64,...
  • qq_38082431
  • qq_38082431
  • 2018-01-28 15:21:45
  • 102

Json解析类(处理时间格式)

using System; using System.Data; using System.Text; using System.Collections.Generic; using System.R...
  • zhenyuanjie
  • zhenyuanjie
  • 2013-11-04 17:40:00
  • 1075

java 解析 json文件 java 解析 json文件

  • 2010年03月22日 22:37
  • 2KB
  • 下载

json解析js Tools

  • 2008年08月26日 10:55
  • 20KB
  • 下载

java json解析简单测试

  • 2013年08月28日 11:43
  • 706B
  • 下载

Json 详细解读 解析

JSON的定义:        一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不...
  • wdx_1136346879
  • wdx_1136346879
  • 2016-04-20 16:13:49
  • 1341

JSON的解析

  • 2013年01月07日 10:52
  • 2KB
  • 下载

json解析个人案例

  • 2015年10月13日 15:40
  • 1.42MB
  • 下载

面试问题之:JSON是什么?

JSON详解 JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式。XML也是一种...
  • u011240877
  • u011240877
  • 2015-06-26 16:14:53
  • 8893

oracle json 解析函数

oracle json 解析函数
  • tstcylq
  • tstcylq
  • 2015-11-16 09:46:22
  • 2896
收藏助手
不良信息举报
您举报文章:关于json解析
举报原因:
原因补充:

(最多只允许输入30个字)