当前位置:小鱼儿玄机二站 > 关于计算机 > 详解JSONObject和JSONArray区别及基本用法

详解JSONObject和JSONArray区别及基本用法

文章作者:关于计算机 上传时间:2019-09-03

由于快过大年的缘故,项目组未有太多任务,闲来无事商讨了须臾间spring中restful调用。开掘spring竟然一度庞大到如此程度,程序员已经无需在关心在写接口的进度中数据的更换以及调用,只须求注意工作。上边作者总计一出手续及其在探讨进程的碰着的难点。

 一、JSONObject和JSONArray的数据表示情势

步骤:

JSONObject的多少是用 {  } 来代表的,

           1、git clone 从spring官英特网下载了源码

        例如:  { "id" : "123", "courseID" : "huangt-test", "title" : "提交作业", "content" : null  }

           2、进行maven编译(gradle也行)

而JSONArray,从名称想到所包罗的意义是由JSONObject构成的数组,用  [ { } , { } , ......  , { } ]  来表示

           3、运行、访问

       例如:  [ {  "id" : "123", "courseID" : "huangt-test", "title" : "提交作业" }  ,  {  "content" : null, "beginTime" : 1398873600000  "endTime" } ] ;

           4、运转结果能把对象转变为json对象回来给页面

        表示了含有2个JSONObject的JSONArray。

 这时作者就在切磋什么能让乞求的数量自动调换为java对象啊,通过google,发掘其实spring已经提供了HttpMessageConverter转变器,并且暗中同意情形下是加载了 MappingJackson2HttpMessageConverter(json ~object转变的类)。只须求布置@RequestBody Greeting gree 就能够使用。

能够看出二个很引人瞩指标区分,一个最外侧用的是 {  }  ,三个最外侧用的是 [  ]  ;

controller层代码如下:

二、怎么样从字符串String得到JSONObject对象和JSONArray对象         

@RequestMapping(value = "/greeting", method = RequestMethod.POST,consumes = "application/json")
  public @ResponseBody Greeting greeting(@RequestBody Greeting gree) { 
    System.out.println(gree.getContent());
    return gree;
  }
JSONObject jsonObject = new JSONObject ( String str);
     JSONArray jsonArray = new JSONArray(String  str ) ;

此刻笔者通过Google的插件(postman)举办调用,死活调用不成功!

三、如何从JSONArray中获得JSONObject对象

解析难题及减轻难题:

       我们能够把JSONArray当成一般的数组来相比较,只是获得的数据内数据的点子分裂样               

此刻小编深感题指标来由大概出在如下多少个方面:

JSONObject  jsonObject = jsonArray.getJSONObject(i) ;  

 1、spring默许未有加载Mapping杰克逊2HttpMessageConverter(不精晓具体加载方式)

四、获取JSON内的数额 

 2、Mapping杰克逊2HttpMessageConverter加载后无法干活(不晓得不干活缘故)

 int  mid= jsonObject.getInt ( "id" ) ;  // 这里的mid得到的数据就是123.
   String mcourse=jsonObject.getString( " courseID") ;  // 这里的mcourse得到的数据就是huangt-test.

实际上最后面变成不干活的原因是太相信spring的源码(对象未有提供set方法导致),带着这两疑云在网新加坡量寻找者找不到对应结果。没有艺术只好从根本上找到标题原因,看spring源代码。

总结

本着第八个难点:

您或许感兴趣的篇章:

  • JSONObject使用方式详解
  • java使用JSONObject实例
  • java json字符串转JSONObject和JSONArray以及取值的实例
  • JSON字符串转换JSONObject和JSONArray的秘籍
  • Java代码实现Map和Object互转及Map和Json互转
  • 浅析Java中JSONObject和JSONArray使用
  • SpringMVC restful 注解之@RequestBody进行json与object转换
  • Android中gson、jsonobject分析JSON的情势详解
  • JSONObject与JSONArray的使用
  • JSON.parseObject和JSON.toJSONString实例详解

    率先步:手动重写加载类型转变器

@Configuration
  @EnableWebMvc
public class WebConfiguration extends WebMvcConfigurerAdapter {
  public void configureMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
    System.out.println("init convert is start !!!!!");
    StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();
    stringConverter.setWriteAcceptCharset(false);
    messageConverters.add(new MappingJackson2HttpMessageConverter());
    System.out.println("init convert is stop !!!!!");
  }
}

测验发掘还是不可能采纳,那时就更不精晓原因了。只好看默许情形下spring是怎么加载类型转变器的。结果开掘在WebMvcConfigurationSupport中这几个措施addDefaultHttpMessageConverters(HttpMessageConverter这几个关键字反射搜索到应用地点通过决断及其追踪找到的)中如下代码:

@SuppressWarnings("deprecation")
  protected final void addDefaultHttpMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
    StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();
    stringConverter.setWriteAcceptCharset(false);
    messageConverters.add(new ByteArrayHttpMessageConverter());
    messageConverters.add(stringConverter);
    messageConverters.add(new ResourceHttpMessageConverter());
    messageConverters.add(new SourceHttpMessageConverter<Source>());
    messageConverters.add(new AllEncompassingFormHttpMessageConverter());
    if (romePresent) {
      messageConverters.add(new AtomFeedHttpMessageConverter());
      messageConverters.add(new RssChannelHttpMessageConverter());
    }
    if (jaxb2Present) {
      messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
    }
    if (jackson2Present) {
      messageConverters.add(new MappingJackson2HttpMessageConverter());
    }
    else if (jacksonPresent) {
      messageConverters.add(new org.springframework.http.converter.json.MappingJacksonHttpMessageConverter());
    }
  }

曾经加载了对应的默许调换器。断点调节和测验表明暗中同意配置是从未有过难题的。

只能表明是第三个难点变成的,然则不通晓为啥导致那几个标题(json数据难点,依然别的标题),在不明了难点的景观下,只可以看request伏乞过来,转变器是怎么专门的学问的。因为自个儿对spring不是特意询问,所以不知其原理。在这种情形下依然不得不依靠(HttpMessageConverter)关键类找到呼应选拔地点。以经验进行剖断和调治。开掘在AbstractMessageConverterMethodArgumentResolver中的readWithMessageConverters方法是request诉求过来实行类型调换的拍卖办法。

protected <T> Object readWithMessageConverters(HttpInputMessage inputMessage,
      MethodParameter methodParam, Type targetType) throws IOException, HttpMediaTypeNotSupportedException {
    MediaType contentType;
    try {
      contentType = inputMessage.getHeaders().getContentType();
    }
    catch (InvalidMediaTypeException ex) {
      throw new HttpMediaTypeNotSupportedException(ex.getMessage());
    }
    if (contentType == null) {
      contentType = MediaType.APPLICATION_OCTET_STREAM;
    }
    Class<?> contextClass = methodParam.getContainingClass();
    Class<T> targetClass = (Class<T>) ResolvableType.forType(targetType,
        ResolvableType.forMethodParameter(methodParam)).resolve();
    for (HttpMessageConverter<?> converter : this.messageConverters) {
      if (converter instanceof GenericHttpMessageConverter) {
        GenericHttpMessageConverter<?> genericConverter = (GenericHttpMessageConverter<?>) converter;
        if (genericConverter.canRead(targetType, contextClass, contentType)) {
          if (logger.isDebugEnabled()) {
            logger.debug("Reading [" + targetType + "] as "" +
                contentType + "" using [" + converter + "]");
          }
          return genericConverter.read(targetType, contextClass, inputMessage);
        }
      }
      if (targetClass != null) {
        if (converter.canRead(targetClass, contentType)) {
          if (logger.isDebugEnabled()) {
            logger.debug("Reading [" + targetClass.getName() + "] as "" +
                contentType + "" using [" + converter + "]");
          }
          return ((HttpMessageConverter<T>) converter).read(targetClass, inputMessage);
        }
      }
    }
    throw new HttpMediaTypeNotSupportedException(contentType, allSupportedMediaTypes);
  }

那儿发现实际早就依照HttpMessageConverter的canRead方法已经找到了对应的品类音讯调换器Mapping杰克逊2HttpMessageConverter,何况已经开头实行转换了,只是抛出了运营时非常。因为那三个没有在调控台出口。作者通过断点调节和测量试验发掘Mapping杰克逊2HttpMessageConverter的readJavaType方法抛出运转时丰盛,通过源代码开采底层是用的jackson的objectMapper实行操作的,代码如下:

try {
      return this.objectMapper.readValue(inputMessage.getBody(), javaType);
    }
    catch (IOException ex) {
      throw new HttpMessageNotReadableException("Could not read JSON: " + ex.getMessage(), ex);
    }

如是小编就把代码单独拿出来在main方法里面运转,照旧要命,那时我就好定位难题了。要不是项目错误,要不是输入数据失实。留心检查开掘json数据尚未难点,用jsonobject也能开展转移。那时只可以推断是传播的javaType有标题产生的。如是作者展开采现目的(Greeting)未有set方法,笔者想是或不是因为此jakson没有办法干活儿呢(原理不明了)。如是乎自己给此目的提供了set方法,再运维能够了。绕了一圈终于把难点一举成功了,可是经过那个难点让本人尤其明亮了spring的restful的办事机制。

您或许感兴趣的稿子:

  • JSONObject使用办法详解
  • java使用JSONObject实例
  • java json字符串转JSONObject和JSONArray以及取值的实例
  • JSON字符串调换JSONObject和JSONArray的法门
  • Java代码完毕Map和Object互转及Map和Json互转
  • 浅析Java中JSONObject和JSONArray使用
  • Android中gson、jsonobject深入分析JSON的格局详解
  • JSONObject与JSONArray的使用
  • 详解JSONObject和JSONArray不一样及骨干用法
  • JSON.parseObject和JSON.toJSONString实例详解

本文由小鱼儿玄机二站发布于关于计算机,转载请注明出处:详解JSONObject和JSONArray区别及基本用法

关键词: