GVKun编程网logo

Jasson库使用(jasper库)

1

在这篇文章中,我们将为您详细介绍Jasson库使用的内容,并且讨论关于jasper库的相关问题。此外,我们还会涉及一些关于1.初识Jackson--世界上最好的JSON库、android–为crout

在这篇文章中,我们将为您详细介绍Jasson库使用的内容,并且讨论关于jasper库的相关问题。此外,我们还会涉及一些关于1. 初识Jackson -- 世界上最好的JSON库、android – 为crouton库使用自定义样式、cJSON库使用教程、fastjson 1.2.47 发布,阿里开源Java JSON库的知识,以帮助您更全面地了解这个主题。

本文目录一览:

Jasson库使用(jasper库)

Jasson库使用(jasper库)

#include <stdio.h>
#include <jansson.h>
int main()
{
   
    json_t *ptJsRoot = json_pack("{s:s, s:{}, s:{}, s:{}}",
              "devid", "111",
              "card_lights_info",
              "left_smu_lights_info",
              "right_smu_lights_info");

    if( NULL == ptJsRoot)
    {
       printf("ptJsRoot pack failed!\n");
       return ;
    }

    json_t * ptJsTmp = NULL;
    //card_lights_info
    json_t *ptJsCardLighsInfo=NULL;
    ptJsCardLighsInfo = json_pack("{s:i, s:[]}","card_nums",3, "card_lights_detail");
    if( NULL == ptJsCardLighsInfo)
    {
      printf("ptJsCardLighsInfo pack failed!\n");
      return ;
    }

    ptJsTmp = json_object_get(ptJsRoot, "card_lights_info");
    if( NULL == ptJsTmp)
    {
      printf("ptJsTmp card_lights_info not exist!\n");
      return ;
    }

   json_object_update_missing(ptJsTmp, ptJsCardLighsInfo);
   json_decref(ptJsCardLighsInfo);
  

   ptJsTmp = json_object_get(ptJsRoot, "card_lights_info");
   if( NULL == ptJsTmp )
   {
     printf("card_lights_info not exist!\n");
   }

   printf("card_nums: %d\n", json_integer_value( json_object_get(ptJsTmp, "card_nums") ));


    ptJsTmp = json_object_get(ptJsTmp, "card_lights_detail");
    if( NULL == ptJsTmp)
    {
      printf("ptJsTmp card_lights_detail not exist!\n");
      return ;
    }
      //card_lights_detail
    int i = 0;
    int j = 0;
    for( i= 0; i < 3; i++)
    {
        json_t *ptJsCardLightsDetail = json_pack("{s:s,s:i,s:[]}",
                "card_guid","11111111",
                "lights_num",i,
                "lights_info");
       if( NULL == ptJsCardLightsDetail)
      {
           printf("ptJsCardLightsDetail json_pack failed!\n");
           return ;
      }

      json_t *ptJsLinghtsInfoTmp = json_object_get(ptJsCardLightsDetail, "lights_info");
      if( NULL == ptJsLinghtsInfoTmp )
      {
         printf("lights_info is not exist!\n");
         return ;
      }

      for( j = 0; j < i; j++)
      {
          json_t *ptJsLightsInfo = json_pack("{s:i,s:i}",
                                  "lights_type",i,
                                  "lights_color",j);
          if( NULL == ptJsLightsInfo )
          {
            printf("ptJsCardLightsDetail json_pack failed!\n");
            return;
          }

          json_array_append(ptJsLinghtsInfoTmp, ptJsLightsInfo);
          json_decref(ptJsLightsInfo);
      }
      json_array_append(ptJsTmp, ptJsCardLightsDetail);
      json_decref(ptJsCardLightsDetail);
    }


    printf("--------------------------------------\n");
    for( i = 0; i< json_array_size(ptJsTmp); i++)
    {
       json_t * ptCardinfo = json_array_get(ptJsTmp, i);
       printf("lights_num: %d\n", json_integer_value(json_object_get(ptCardinfo, "lights_num")));
       printf("card_guid: %s\n", json_string_value(json_object_get(ptCardinfo, "card_guid")));
       printf("----------\n");
       json_t *ptJsLightsTmp = json_object_get(ptCardinfo, "lights_info");
       if( NULL == ptJsLightsTmp )
       { 
         printf("lights_info is not exist!\n");
         return ;
       }

       for( j = 0; j < json_integer_value(json_object_get(ptCardinfo, "lights_num")); j++ )
       {
          json_t * ptJsLightsInfo = json_array_get(ptJsLightsTmp, j);
          printf("lights_type: %d\n", json_integer_value(json_object_get(ptJsLightsInfo, "lights_type")));
          printf("lights_color: %d\n", json_string_value(json_object_get(ptJsLightsInfo, "lights_color")));
          printf("------------------------\n");
       }
    }


     
    //  json_t * ptJsTmp1 = NULL;
    //  ptJsTmp1 = json_object_get(ptJsRoot, "card_lights_info");
    // if( NULL == ptJsTmp1 )
    // {
    //   printf("card_lights_info not exist!\n");
    // }
    // printf("--------------------------------------\n");
    // printf("card_nums: %d\n", json_integer_value( json_object_get(ptJsTmp1, "card_nums") ));

    //  ptJsTmp1 = json_object_get(ptJsTmp1, "card_lights_detail");

    // if( NULL == ptJsTmp1 )
    // {
    //   printf("card_lights_detail not exist!\n");
    // }

    // printf("--------------------------------------\n");
    // for( i = 0; i< json_array_size(ptJsTmp1); i++)
    // {
    //    json_t * ptCardinfo1 = json_array_get(ptJsTmp1, i);
    //    printf("lights_num: %d\n", json_integer_value(json_object_get(ptCardinfo1, "lights_num")));
    //    printf("card_guid: %s\n", json_string_value(json_object_get(ptCardinfo1, "card_guid")));
    // }

}

编译:gcc -o test test.c -ljansson -Wl,-rpath=/usr/local/lib/

1. 初识Jackson -- 世界上最好的JSON库

1. 初识Jackson -- 世界上最好的JSON库

要想人前显贵,必须背后受罪。关注公众号【BAT的乌托邦】开启专栏式学习,拒绝浅尝辄止。本文 https://www.yourbatman.cn 已收录,里面一并有Spring技术栈、MyBatis、中间件等小而美的专栏供以学习哦。

前言

各位小伙伴大家好,我是A哥。上篇文章 【Fastjson到了说再见的时候了】 A哥跟Fastjson说了拜拜,从本系列开始,我们将一起进入Jackson库的学习。当然喽说它是世界上最好的JSON库并非一家之言,是官网上它自己说的,我免责申明哈。

一个工程仅需一个JSON库

Java的JSON库,你至少应该用过/听过这三种:Jackson、Gson、Fastjson。一个独立的工程,按照依赖最少原则,本应该only one JSON库是足矣的。但现状是:各位同仁可观察观察各自的项目,大都同时存在2种JSON库,亦或者3种甚至更多...

说明:在同一个工程内,同一功能若有多种实现,实属不好的现象。这会让管理起来显得混乱(譬如对日期的格式化就不方便做到统一),出口若有多个,想收口时就是个大难题了

作为一个合格的架构师/工程师,保持最简依赖(一致性依赖)是应该有的技术范,因为简单一致性它能带来很大的收益,道理很简单:两个Java程序员的沟通/协同效率,一定会比1个Java + 1个Python沟通效率高。

so what,我们应该选择哪一种JSON库呢?答案显而易见,那便是Jackson。因为它各个方面表现均非常优秀,是世界最流行、最好的JSON库。把Jackson作为工程唯一JSON库是有一丢丢门槛的(想想你为何使用Fastjson就知道啦),所以它来啦,祝你跨越此门槛,规范化使用,助你增加一项主流的硬核实力,这也是本专栏的最大意义所在


Jackson是世界最好的JSON库

Jackson是一个简单的、功能强大的、基于Java的应用库。它可以很方便完成Java对象Json对象(xml文档or其它格式)进行互转。Jackson社区相对比较活跃,更新速度也比较快。Jackson库有如下几大特性:

  • 高性能且稳定:低内存占用,对大/小JSON串,大/小对象的解析表现均很优秀
  • 流行度高:是很多流行框架的默认选择
  • 容易使用:提供高层次的API,极大简化了日常使用案例
  • 无需自己手动创建映射:内置了绝大部分序列化时和Java类型的映射关系
  • 干净的JSON:创建的JSON具有干净、紧凑、体积小等特点
  • 无三方依赖:仅依赖于JDK
  • Spring生态加持:jackson是Spring家族的默认JSON/XML解析器(明白了吧,学完此专栏你对Spring都能更亲近些了,一举两得)

版本约定:本专栏统一使用的版本号固定为2.10.1(2019-12-09发布),GAV如下:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.10.1</version>
</dependency>

为了保持版本的统一性,后续的Spring Boot(2.2.2.RELEASE)/Spring Framework(5.2.2.RELEASE)使用的均为当前最新版本,因为它内置的jackson也恰好就是本专栏讲解的版本。


正文

细心的朋友从上面的groupId里可以看到:jackson它隶属于fasterxml这个组织。本着追本溯源的精神,可以稍微的了解了解这个组织:fasterxml官网 截图如下


简单翻译:FasterXML是Woodstox流的XML解析器、Jackson流的JSON解析器、Aalto非阻塞XML解析器以及不断增长的实用程序库和扩展家族背后的业务。

作为一个高度流行的开源库,这种官网页面应该刷新了你的认知吧。并不是它内容不多,而其实是它的详细介绍都发布在github上了,这便是接下来我们来认识它的主要渠道。

这种做法貌似已经成为了一种流行的趋势:越来越多的开源软件倾向于把github作为他们的Home Page了

fasterxml组织它直属的一级工程其实也有不少:

  1. com.fasterxml.jackson
  2. com.fasterxml.uuid
  3. com.fasterxml.woodstox
  4. ...

很显然,本专栏仅仅只会关注jackson工程,该工程便是该组织最出名且最最最为重要的部分。


官网介绍

了解一门新的技术,第一步应该就是看它的官网。上面已然解释了,fasterxml组织它把各工程的首页内容都托管在了github上,Jackson当然也不例外。Jackson官网 上对它自己有如下描述:

Jackson旧称为:Java(或JVM平台)的标准JSON库,或者是Java的最佳JSON解析器,或者简称为“Java的JSON

从这名字就霸气外露了,NB得不行,足以见得它在JSON解析方面的地位和流行程度,当然主要是自信

更重要的是,Jackson是一套JVM平台的 数据处理(不限于JSON) 工具集:包括 一流的 JSON解析器/ JSON生成器、数据绑定库(POJOs to and from JSON);并且提供了相关模块来支持 Avro, BSON, CBOR, CSV, Smile, Properties, Protobuf, XML or YAML等数据格式,甚至还支持大数据格式模块的设置。


分支:1.x和2.x

Jackson有两个主要的分支:

  • 1.x分支,处于维护模式,只发布bug修复版本(最近一次发布于Jul, 2013)
  • 2.x是正在开发的版本(持续更新升级中,2.0.0发布于Mar, 2012)

注意:这两个主要版本使用不同的Java包名和Maven GAV,因此它们并不相互兼容,但可以和平共存。一个项目可以同时依赖于这两个版本是没有冲突的。这是经过设计而为之,选择这种策略是为了更顺利地从1.x进行迁移2. x

说明:现在都2020年了,1.x可以毫不客气的说已经淘汰了(除了非常老的项目还在用),因此针对1.x版本本专栏不会有任何涉猎。

模块介绍

Jackson是个开源的、且开放的社区。下面列出的大多数项目/模块是由Jackson开发团队领导的,但也有一些来自Jackson社区的成员


三大核心模块

core module(核心模块) 是扩展模块构建的基础。Jackson目前有3个核心模块:

说明:核心模块的groupId均为:<groupId>com.fasterxml.jackson.core</groupId>,artifactId见下面各模块所示
  • Streaming流处理模块(jackson-core):定义底层处理流的API:JsonPaser和JsonGenerator等,并包含特定于json的实现。
  • Annotations标准注解模块(jackson-annotations):包含标准的Jackson注解
  • Databind数据绑定模块(jackson-databind):在streaming包上实现数据绑定(和对象序列化)支持;它依赖于上面的两个模块,也是Jackson的高层API(如ObjectMapper)所在的模块

实际应用级开发中,我们只会使用到Databind数据绑定模块,so它是本系列重中之重。下面介绍那些举足轻重的第三方模块


数据类型模块

这些扩展是Jackson插件模块(通过ObjectMapper.registerModule()注册,下同),并通过添加序列化器和反序列化器来对各种常用Java库数据类型的支持,以便Jackson databind包(ObjectMapper / ObjectReader / ObjectWriter)能够顺利读写/转换这些类型。

第三方模块有些是Jackson官方人员直接lead和维护的(主流模块),也有些是纯社区行为。现在按照这两个分类分别介绍一下各个模块的作用:

官方直接维护:

说明:官方维护的这些数据类型模块的groupId统一为:<groupId>com.fasterxml.jackson.datatype</groupId>,且版本号是和主版本号保持一致的
  • 标准集合数据类型模块:

    • Guava:支持Guava的集合数据类型
    • HPPC:略
    • PCollections:略 (Jackson 2.7新增的支持)
  • Hibernate:支持Hibernate的一些特性,如懒加载、proxy代理等
  • Joda:支持Joda date/time的数据类型
  • JDK7:对JDK7的支持(说明:2.7以后就无用了,以为2.7版本后最低的JDK版本要求是7)
  • Java8:它分为如下三个子模块来支持Java8

    • jackson-module-parameter-names:此模块能够访问构造函数和方法参数的名称,从而允许省略@JsonProperty(当然前提是你必须加了编译参数:-parameters
    • jackson-datatype-jsr310:支持Java8新增的JSR310时间API
    • jackson-datatype-jdk8:除了Java8的时间API外其它的API的支持,如Optional
  • JSR-353/org.json:略

非官方直接维护:

说明:非官方直接维护的这些模块groupId是不定的,每个模块可能都不一样,并且它们的版本号不会随着官方的主版本号一起走
  • jackson-datatype-bolts:对 Yandex Bolts collection types 的支持
  • jackson-datatype-commons-lang3:支持Apache Commons Lang v3里面的一些类型
  • jackson-datatype-money:支持javax.money
  • jackson-datatype-json-lib:对久远的json-lib这个库的支持
  • ...

数据格式模块

Data format modules(数据格式模块)提供对JSON之外的数据格式的支持。它们中的大多数只是实现streaming API抽象,以便数据绑定组件可以按原样使用。

官方直接维护:

说明:这些数据格式的模块的groupId均为<groupId>com.fasterxml.jackson.dataformat</groupId>,且跟着主版本号走
  • Avro/CBOR/Ion/Protobuf/Smile(binary JSON) :这些均属于二进制的数据格式,它们的artifactId为:<artifactId>jackson-dataformat-[FORMAT]</artifactId>
  • CSV/Properties/XML/YAML:这些格式熟悉吧,同样的支持到了这些常用的文本格式

非官方直接维护:
因非官方直接维护的模块过于偏门,因此省略


JVM平台其它语言

官网有说,Jackson是一个JVM平台的解析器,因此语言层面不局限于Java本身,还涵盖了另外两大主流JVM语言:Kotlin和Scala

说明:这块的groupId均为:<groupId>com.fasterxml.jackson.module</groupId>,版本号跟着主版本号走
  • jackson-module-kotlin:处理kotlin源生类型
  • jackson-module-scala_[scala版本号]:处理scala源生类型

模式支持

Jackson注解为POJO定义了预期的属性和预期的处理,除了Jackson本身将其用于读取/写入JSON和其他格式之外,它还允许生成外部模式。上面已讲述的数据格式扩展中包含了部分功能,但也仍还有许多独立的模式工具,如:

  • Ant Task for JSON Schema Generation:使用Apache Ant时,使用Jackson库和扩展模块从Java类生成JSON
  • jackson-json-schema-maven-plugin:maven插件,用于生成JSON
  • ...
说明:本部分因实际应用场景实在太少,为了不要混淆主要内容,此部分后面亦不会再提及

Jackson jr(用于移动端)

虽然Jackson databind(如ObjectMapper)是通用数据绑定的良好选择,但它的占用空间(Jar包大小)启动开销在某些领域可能存在问题:比如移动端,特别是对于轻量使用(读或写)。这种case下,完整的Jackson API是让人接受不了的。

由于所有这些原因,Jackson官方决定创建一个更简单、更小的库:Jackson jr。它仍旧构建在Streaming API之上,但不依赖于databind和annotation。因此,它的大小(jar和运行时内存使用)要小得多,它的API非常紧凑,所以适合APP等移动端。

<dependency>
    <groupId>com.fasterxml.jackson.jr</groupId>
    <artifactId>jackson-jr-objects</artifactId>
</dependency>

它仅仅只依赖了jackson-core模块,所以体积上控制得非常的好。Jackson单单三大核心模块大小合计1700KB左右(320 + 70 + 1370)。而Jackson jr的体积控制在了95KB(就算加上core模块的320也不到500KB)。

而对于开发Java后台的我们对内存并不敏感,简单易用、功能强大才是硬道理。因此jackson-jr只是在此处做个简单了解即可,本专栏后面也不会再提及。


漏洞报告

Jackson虽然已经足够稳定并且安全了,但哪有圣人呢。针对它的相关漏洞报告,最近一次发生在2019-07-23:FasterXML jackson-databind 远程代码执行(CVE-2019-12384)
更多、更新的详细漏洞报告参考链接(持续更新中):知道创宇Jackson漏洞报告


Java JSON库比较

市面上的JSON库非常之多,综合一些Java人员的意见,关于使用哪个库,这里有一些现有的独立比较的链接供以你参考:

  • Top 7 Open-Source JSON-binding providers
  • Be a Lazy but a Productive Android Developer, Part 3: JSON Parsing Library
  • "Can anyone recommend a good Java JSON library" (Linked-In group)
  • "Which JSON library to use on Android?"

说明:此处贴出的几个参考链接均为官网给出的参考文章,均为国外较权威的文献。

当然天朝的你可能更关心Jackson和Fastjson的对比,那暂先不用着急(虽然上文也比较过),这是本专栏后面的一道主菜,那里会详细道来。


总结

本文结合官网认识了Jackson的全貌,用全面的视角整体上把握到了Jackson所提供的功能模块,这为专栏后续的讲解提供一个索引。

从Jackson的升级之快、模块支持之多足矣看得见它社区的活跃。并且为了迎合市场它在2.10版本后还提供了商业支持的服务:与Tidelift公司合作,为用户构建应用程序的开源依赖项提供商业支持和维护。节省时间、降低风险和改善代码健康状况(商业支持是收费的)。

相信通过本文你对Jackson有了个大概的了解,不出意外你应该是有兴趣去学它了的。当你深入研究后会发现它的设计之优雅,扩展性之强,不是一般国产类库所能比拟的。如果说Fastjson是一个优秀的JSON库,那么Jackson就是一个更优秀的JSON生态。


本专栏在CSDN付费,在公众号全部免费公开,欢迎你关注A哥的公众号【BAT的乌托邦】


关注A哥

  • 原创不易,码字更不易。关注A哥的公众号【BAT的乌托邦】,开启有深度的专栏式学习,拒绝浅尝辄止
  • 专栏式学习,我们是认真的(关注公众号回复“知识星球”领券后再轻装入驻)
  • 加A哥好友(fsx641385712),备注“Java入群”邀你进入【Java高工、架构师】系列纯纯纯技术群

BAT的乌托邦公众号二维码

android – 为crouton库使用自定义样式

android – 为crouton库使用自定义样式

我正在使用Crouton lib(https://github.com/keyboardsurfer/Crouton).

现在,我想使用自定义样式而不是默认样式.我能怎么做 ?

Style.ALERT是默认样式.

Crouton.showtext(this, "test", Style.ALERT);

我想用这种风格:

@styles:

<style name="CroutonGreen">
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:background">@color/color_pressed_buy_an_item</item>
    <item name="android:gravity">center</item>

</style>

解决方法:

它说here:

一般来说,你可以修改

显示持续时间
尺寸设置
要显示的文本的选项
自定义视图
外观&消失动画
显示图像

由于Style是调整油炸面包丁的一般切入点,因此请亲自去看看可以用它做什么.

您可以尝试使用以下代码修改该类以更改背景颜色:

static {
ALERT = new Builder()
  .setBackgroundColorValue(holoRedLight)
  .build();
CONFIRM = new Builder()
  .setBackgroundColorValue(holoGreenLight)
  .build();
INFO = new Builder()
  .setBackgroundColorValue(holoBlueLight)
  .build();
CUSTOM = new Builder()
  .setBackgroundColorValue(myColor)
  .build();

}

我没有测试它,但我认为它应该工作.

然后在该类的下面有以下代码:

 public Builder() {
  configuration = Configuration.DEFAULT;
  paddingInPixels = 10;
  backgroundColorResourceId = android.R.color.holo_blue_light;
  backgroundDrawableResourceId = 0;
  backgroundColorValue = NOT_SET;
  isTileEnabled = false;
  textColorResourceId = android.R.color.white;
  textColorValue = NOT_SET;
  heightInPixels = LayoutParams.WRAP_CONTENT;
  widthInPixels = LayoutParams.MATCH_PARENT;
  gravity = Gravity.CENTER;
  imageDrawable = null;
  imageResId = 0;
  imageScaleType = ImageView.ScaleType.FIT_XY;
  fontName = null;
  fontNameResId = 0;
}

heightInPixels,widthInPixels,gravity已根据您的风格正确设置.

最后,在您的应用中,使用Style.CUSTOM调用您的烤面包片.

Crouton.showtext(this, "test", Style.CUSTOM);

cJSON库使用教程

cJSON库使用教程

转载自:http://blog.csdn.net/geqiandebei/article/details/47977103

CSJON库基本数据格式 cJSON 定义

  1. typedefstructcJSON{
  2. structcJSON*next,*prev;//数组对象数据中用到
  3. structcJSON*child;//数组和对象中指向子数组对象或值
  4. inttype;//元素的类型,如是对象还是数组
  5. char*valuestring;//如果是字符串
  6. intvalueint;//如果是数值
  7. doublevaluedouble;//如果类型是cJSON_Number
  8. char*string;//Theitem'snamestring,ifthisitemisthechildof,orisinthelistofsubitemsofanobject.
  9. }cJSON;

构造JSON:

首先创建JSON主对象

[cpp] view plain copy print ?
  1. cJSON*root=cJSON_CreateObject();

类似的创建数组对象

?

fastjson 1.2.47 发布,阿里开源Java JSON库

fastjson 1.2.47 发布,阿里开源Java JSON库

这又是一个Bug修复的小版本,更好支持kotlin、嵌套泛型、jsonpath。

Issues

  1. 修复多级泛型的里层无法正常解析的问题 #1763 #569

  2. 修复kotlin在某些特别场景下反序列化不对的问题 #1750

  3. 修复float超过精度导致负数的问题 #1723

  4. jsonpath支持条件组合 #1733

相关链接

  • 下载 http://repo1.maven.org/maven2/com/alibaba/fastjson/1.2.47/

  • 文档 https://github.com/alibaba/fastjson/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98

  • 源码 https://github.com/alibaba/fastjson/tree/1.2.47


今天的关于Jasson库使用jasper库的分享已经结束,谢谢您的关注,如果想了解更多关于1. 初识Jackson -- 世界上最好的JSON库、android – 为crouton库使用自定义样式、cJSON库使用教程、fastjson 1.2.47 发布,阿里开源Java JSON库的相关知识,请在本站进行查询。

本文标签: