Json——JsonElement

转自http://blog.youkuaiyun.com/chunqiuwei/article/details/49160321

该类是一个抽象类,代表着json串的某一个元素。这个元素可以是一个Json(JsonObject)、可以是一个数组(JsonArray)、可以是一个Java的基本类型(JsonPrimitive)、当然也可以为null(JsonNull);JsonObject,JsonArray,JsonPrimitive,JsonNull都是JsonElement这个抽象类的子类。JsonElement提供了一系列的方法来判断当前的JsonElement是否是上述子类的一种:比如isJsonObject()用来判断当前的json元素是否是一个数组类型,它的实现很简单且这里巧妙地应用了Java的多态机制:

public boolean isJsonObject() {  
  return this instanceof JsonObject;  
}

同样的既然有isJsonObject()等这样的判断,该类也提供了把当前JsonElement作为上述子类的一种返回的方法:

    public JsonObject getAsJsonObject() {  
      if (isJsonObject()) {  
        return (JsonObject) this;  
      }  
      throw new IllegalStateException("Not a JSON Object: " + this);  
    }  

JsonObject对象可以看成 name/values的集合,而这写values就是一个个JsonElement,他们的结构可以用如下图表示:


JsonPrimitive:

       JsonElement的子类,该类对Java的基本类型及其对应的对象类进行了封装,并通过setValue方法为value赋值

private static final Class<?>[] PRIMITIVE_TYPES = { int.class, long.class, short.class,  
    float.class, double.class, byte.class, boolean.class, char.class, Integer.class, Long.class,  
    Short.class, Float.class, Double.class, Byte.class, Boolean.class, Character.class };  
  
private Object value;

需要注意的是对于Character类型的json元素需要特殊处理:

void setValue(Object primitive) {  
    if (primitive instanceof Character) {  
      // convert characters to strings since in JSON, characters are represented as a single  
      // character string  
      char c = ((Character) primitive).charValue();  
      this.value = String.valueOf(c);  
    } else {  
      $Gson$Preconditions.checkArgument(primitive instanceof Number  
              || isPrimitiveOrString(primitive));  
      this.value = primitive;  
    }  
  } 

同时对于传入的其他json类型通过checkArgumeng进行过滤,如果不是是Number或者String和 PRIMITIVE_TYPES里的一种的话,就会抛出异常。
private static boolean isPrimitiveOrString(Object target) {  
    if (target instanceof String) {  
      return true;  
    }  
    //在这里是Java class的一个简单应用  
    Class<?> classOfPrimitive = target.getClass();  
    for (Class<?> standardPrimitive : PRIMITIVE_TYPES) {  
     //isAssingableFrom方法的作用是判断classsOfPrimitive是否可以转换为standardPrimitive类型  
    if (standardPrimitive.isAssignableFrom(classOfPrimitive)) {  
        return true;  
      }  
    }  
    return false;  
  }
同样类似JsonElement,该类也提供了判断某一个json元素是否是某一类型的判断和把某一json元素作为某一类型返回的方法: 
public boolean isNumber() {  
  return value instanceof Number;  
}  
  
@Override  
public Number getAsNumber() {  
  return value instanceof String ? new LazilyParsedNumber((String) value) : (Number) value;  
} 

对于Java几个基本类型用JsonPrimitive类进行了封装,  还遗漏了一个null的json元素,Gson也对它进行了单独的处理,就是JsonNull: 

JsonNull:

该类没什么可说的,为不可变类。当然在json中所有的JsonNullObject 调用equals方法判断的话都是相等的。

JsonArray:

Json的数组包含的其实也是一个个Json串。所以不难猜出JsonArray中用一个集合类源码中用List<JsonElement>来添加json数组中的每个元素。(详见源码,很简单)

JsonObject:

json对象类,包含了键值对,键是字符串类型,它的值是一个JsonElement。用 LinkedTreeMap<String, JsonElement> members来保存。





### Java中将流数据转换为JSON的最佳实践 在Java开发中,处理流数据并将其转换为JSON是一种常见的需求。以下是几种实现此功能的方法及其最佳实践。 #### 方法一:使用Jackson库 Jackson是一个广泛使用的JSON处理库,在Java生态系统中有很高的普及率。通过`ObjectMapper`类可以轻松地将输入流(InputStream)解析为JSON对象或字符串。以下是如何利用Jackson将流数据转换为JSON的具体示例: ```java import com.fasterxml.jackson.databind.ObjectMapper; import java.io.InputStream; import java.io.IOException; public class StreamToJsonExample { public static void main(String[] args) throws IOException { InputStream inputStream = getClass().getClassLoader().getResourceAsStream("data.json"); ObjectMapper objectMapper = new ObjectMapper(); String jsonString = objectMapper.readValue(inputStream, String.class); System.out.println(jsonString); } } ``` 上述代码展示了如何读取资源文件中的JSON流,并将其转换为JSON字符串[^1]。 #### 方法二:Gson库的应用 除了Jackson之外,Google提供的Gson也是一个强大的工具,用于序列化和反序列化JSON数据。下面展示的是如何使用Gson将输入流转换成JSON字符串的例子: ```java import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.JsonParser; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.InputStream; public class GsonStreamToJsonExample { public static void main(String[] args) throws Exception { InputStream inputStream = getClass().getClassLoader().getResourceAsStream("data.json"); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); JsonElement jsonTree = JsonParser.parseReader(bufferedReader); Gson gson = new Gson(); String jsonString = gson.toJson(jsonTree); System.out.println(jsonString); } } ``` 这段代码说明了如何借助Gson库完成从输入流转至JSON字符串的操作[^2]。 #### 方法三:结合Spring框架自动转换 如果是在基于Spring的项目环境中工作,则可以通过集成Spring MVC的功能简化这一过程。例如,当控制器接收到HTTP请求体作为输入流时,可以直接配置让其自动映射到目标实体或者保持原始形式以便进一步加工处理。这里给出一个简单的例子来演示这种场景下的应用方式: ```java @RestController @RequestMapping("/api") public class MyController { @PostMapping(value="/upload", consumes="application/json") public ResponseEntity<String> upload(@RequestBody Map<String,Object> jsonData){ // 对接收的数据做相应业务逻辑... return ResponseEntity.ok("Data received successfully."); } } ``` 在这个案例里,客户端发送过来的内容会被自动解释成为Map类型的参数传递给方法内部使用[^3]。 综上所述,无论是独立运行还是嵌入更大规模的企业级解决方案之中,开发者都可以依据具体环境选用合适的手段达成目的——即高效便捷地把来自不同源头的各种形态的流资料转变为我们所需要的标准化JSON表述形式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值