Java和Json的那些事

Java和Json的那些事

一、Java简介

Java是一种广泛使用的编程语言,常用于开发各种类型的应用程序,包括桌面应用程序、移动应用程序和Web应用程序。Java是一种面向对象的语言,具有丰富的类库和强大的功能,可以进行多线程编程、网络编程和安全编程等。

二、Json简介

JSON是一种轻量级的数据交换格式,用于表示简单的数据结构和对象。JSON的数据格式非常简单,易于理解和编写,并且广泛应用于Web应用程序和移动应用程序等领域。在Java中,可以使用第三方库来解析和生成JSON数据,例如GSON和Jackson等库。

三、两者关系

在Java中,可以使用各种库和框架来处理JSON数据,例如JSON库、GSON库、Jackson库等。这些库提供了各种功能,包括将Java对象转换为JSON格式,将JSON格式转换为Java对象,以及处理JSON数组和嵌套JSON等。使用这些库可以使Java开发人员更轻松地处理JSON数据。

四、Java中常用处理JSON数据的API

  1. org.json:这是Java SE 7及更高版本中提供的官方JSON处理API。它提供了JSONObject和JSONArray等类来解析和生成JSON数据。但是这个库已经很久没有更新,且在处理大量数据时性能较差,因此并不推荐使用。
  2. Gson:由Google提供的开源JSON处理库。Gson可以将Java对象转换为JSON格式,也可以将JSON格式转换为Java对象。Gson使用起来非常简单,而且具有良好的性能。它可以处理复杂的嵌套JSON结构,并且支持自定义的序列化和反序列化规则。
  3. Jackson:又称Jackson JSON Processor,是由FasterXML提供的一个开源的高性能JSON处理库。Jackson提供了三个主要的模块:Jackson Core、Jackson Databind和Jackson Annotations。Jackson Core提供了JSON解析和生成的基本API,Jackson Databind用于将Java对象映射到JSON格式,Jackson Annotations用于定义JSON的序列化和反序列化规则。
  4. JSON-lib:一个比较老的开源JSON处理库,已经不再维护。它提供了一些类来解析和生成JSON数据,但是使用起来比较复杂,而且性能不如Gson和Jackson。

以上是Java中常用的处理JSON数据的API,其中Gson和Jackson是目前比较流行和常用的两个库

五、常用类

常用的处理JSON数据的类取决于你选择使用哪个库。以下是几个流行的JSON处理库以及其常用的类:

  1. org.json:
    • JSONObject:用于表示JSON对象。
    • JSONArray:用于表示JSON数组。
    • JSONTokener:用于解析JSON字符串并生成相应的JSONObject或JSONArray对象。
  2. Gson:
    • Gson:主要的类,用于将Java对象转换为JSON格式,以及将JSON格式转换为Java对象。
    • JsonParser:用于解析JSON字符串并生成JsonElement对象。
    • JsonElement:表示JSON元素的抽象类,包括JsonObject、JsonArray、JsonPrimitive和JsonNull。
  3. Jackson:
    • ObjectMapper:主要的类,用于将Java对象转换为JSON格式,以及将JSON格式转换为Java对象。
    • JsonParser:用于解析JSON字符串并生成JsonNode对象。
    • JsonNode:表示JSON节点的抽象类,包括JsonArray、JsonObject、JsonNumber、JsonString和JsonBoolean。

以上是常用的JSON处理库和类。使用不同的库和类,可以根据自己的需求选择最合适的方式处理JSON数据。

六、使用案例

  • 基于org.json
import org.json.*;

public class JsonOrgExample {
    public static void main(String[] args) throws JSONException {
        String jsonString = "{\"name\":\"John\", \"age\":30, \"city\":\"New York\"}";
        JSONObject jsonObject = new JSONObject(jsonString);
        String name = jsonObject.getString("name");
        int age = jsonObject.getInt("age");
        String city = jsonObject.getString("city");
        System.out.println("Name: " + name);
        System.out.println("Age: " + age);
        System.out.println("City: " + city);
    }
}


----------------------------------------------------------------------

import org.json.*;

public class JsonOrgExample {
    public static void main(String[] args) throws JSONException {
        String jsonString = "{\n" +
                "    \"name\": \"John\",\n" +
                "    \"age\": 30,\n" +
                "    \"address\": {\n" +
                "        \"street\": \"123 Main St\",\n" +
                "        \"city\": \"New York\",\n" +
                "        \"state\": \"NY\",\n" +
                "        \"zip\": \"10001\"\n" +
                "    },\n" +
                "    \"phoneNumbers\": [\n" +
                "        {\n" +
                "            \"type\": \"home\",\n" +
                "            \"number\": \"555-1234\"\n" +
                "        },\n" +
                "        {\n" +
                "            \"type\": \"work\",\n" +
                "            \"number\": \"555-5678\"\n" +
                "        }\n" +
                "    ],\n" +
                "    \"emails\": [\n" +
                "        \"john@example.com\",\n" +
                "        \"john.doe@example.com\"\n" +
                "    ]\n" +
                "}";
        JSONObject jsonObject = new JSONObject(jsonString);
        String name = jsonObject.getString("name");
        int age = jsonObject.getInt("age");
        JSONObject addressObject = jsonObject.getJSONObject("address");
        String street = addressObject.getString("street");
        String city = addressObject.getString("city");
        String state = addressObject.getString("state");
        String zip = addressObject.getString("zip");
        JSONArray phoneNumbersArray = jsonObject.getJSONArray("phoneNumbers");
        String homePhoneNumber = phoneNumbersArray.getJSONObject(0).getString("number");
        String workPhoneNumber = phoneNumbersArray.getJSONObject(1).getString("number");
        JSONArray emailsArray = jsonObject.getJSONArray("emails");
        String email1 = emailsArray.getString(0);
        String email2 = emailsArray.getString(1);
        System.out.println("Name: " + name);
        System.out.println("Age: " + age);
        System.out.println("Street: " + street);
        System.out.println("City: " + city);
        System.out.println("State: " + state);
        System.out.println("Zip: " + zip);
        System.out.println("Home phone number: " + homePhoneNumber);
        System.out.println("Work phone number: " + workPhoneNumber);
        System.out.println("Email 1: " + email1);
        System.out.println("Email 2: " + email2);
    }
}


  • Gson
import com.google.gson.*;

public class GsonExample {
    public static void main(String[] args) {
        String jsonString = "{\"name\":\"John\", \"age\":30, \"city\":\"New York\"}";
        Gson gson = new Gson();
        Person person = gson.fromJson(jsonString, Person.class);
        System.out.println("Name: " + person.getName());
        System.out.println("Age: " + person.getAge());
        System.out.println("City: " + person.getCity());
    }
}

class Person {
    private String name;
    private int age;
    private String city;
    
    // getters and setters
}

----------------------------------------------------------------------

import com.google.gson.*;

public class GsonExample {
    public static void main(String[] args) {
        String jsonString = "{\n" +
                "    \"name\": \"John\",\n" +
                "    \"age\": 30,\n" +
                "    \"address\": {\n" +
                "        \"street\": \"123 Main St\",\n" +
                "        \"city\": \"New York\",\n" +
                "        \"state\": \"NY\",\n" +
                "        \"zip\": \"10001\"\n" +
                "    },\n" +
                "    \"phoneNumbers\": [\n" +
                "        {\n" +
                "            \"type\": \"home\",\n" +
                "            \"number\": \"555-1234\"\n" +
                "        },\n" +
                "        {\n" +
                "            \"type\": \"work\",\n" +
                "            \"number\": \"555-5678\"\n" +
                "        }\n" +
                "    ],\n" +
                "    \"emails\": [\n" +
                "        \"john@example.com\",\n" +
                "        \"john.doe@example.com\"\n" +
                "    ]\n" +
                "}";
        Gson gson = new Gson();
        Person person = gson.fromJson(jsonString, Person.class);
        System.out.println("Name: " + person.getName());
        System.out.println("Age: " + person.getAge());
        System.out.println("Street: " + person.getAddress().getStreet());
        System.out.println("City: " + person.getAddress().getCity());
        System.out.println("State: " + person.getAddress().getState());
        System.out.println("Zip: " + person.getAddress().getZip());
        System.out.println("Home phone number: " + person.getPhoneNumbers().get(0).getNumber());
        System.out.println("Work phone number: " + person.getPhoneNumbers().get(1).getNumber());
        System.out.println("Email 1: " + person.getEmails().get(0));
        System.out.println("Email 2: " + person.getEmails().get(1));
    }
}

class Person {
    private String name;
    private int age;
    private Address address;
    private List<PhoneNumber> phoneNumbers;
    private List<String> emails;

    // getters and setters
}

class Address {
    private String street;
    private String city;
    private String state;
    private String zip;

    // getters and setters
}

class PhoneNumber {
    private String type;
    private String number;

    // getters and setters
}


  • Jackson
import com.fasterxml.jackson.databind.*;

public class JacksonExample {
    public static void main(String[] args) throws JsonProcessingException {
        String jsonString = "{\"name\":\"John\", \"age\":30, \"city\":\"New York\"}";
        ObjectMapper objectMapper = new ObjectMapper();
        Person person = objectMapper.readValue(jsonString, Person.class);
        System.out.println("Name: " + person.getName());
        System.out.println("Age: " + person.getAge());
        System.out.println("City: " + person.getCity());
    }
}

class Person {
    private String name;
    private int age;
    private String city;
    
    // getters and setters
}

----------------------------------------------------------------------

import com.fasterxml.jackson.databind.*;

public class JacksonExample {
    public static void main(String[] args) throws JsonProcessingException {
        String jsonString = "{\n" +
                "    \"name\": \"John\",\n" +
                "    \"age\": 30,\n" +
                "    \"address\": {\n" +
                "        \"street\": \"123 Main St\",\n" +
                "        \"city\": \"New York\",\n" +
                "        \"state\": \"NY\",\n" +
                "        \"zip\": \"10001\"\n" +
                "    },\n" +
                "    \"phoneNumbers\": [\n" +
                "        {\n" +
                "            \"type\": \"home\",\n" +
                "            \"number\": \"555-1234\"\n" +
                "        },\n" +
                "        {\n" +
                "            \"type\": \"work\",\n" +
                "            \"number\": \"555-5678\"\n" +
                "        }\n" +
                "    ],\n" +
                "    \"emails\": [\n" +
                "        \"john@example.com\",\n" +
                "        \"john.doe@example.com\"\n" +
                "    ]\n" +
                "}";
        ObjectMapper objectMapper = new ObjectMapper();
        Person person = objectMapper.readValue(jsonString, Person.class);
        System.out.println("Name: " + person.getName());
        System.out.println("Age: " + person.getAge());
        System.out.println("Street: " + person.getAddress().getStreet());
        System.out.println("City: " + person.getAddress().getCity());
        System.out.println("State: " + person.getAddress().getState());
        System.out.println("Zip: " + person.getAddress().getZip());
        System.out.println("Home phone number: " + person.getPhoneNumbers().get(0).getNumber());
        System.out.println("Work phone number: " + person.getPhoneNumbers().get(1).getNumber());
        System.out.println("Email 1: " + person.getEmails().get(0));
        System.out.println("Email 2: " + person.getEmails().get(1));
    }
}

class Person {
    private String name;
    private int age;
    private Address address;
    private List<PhoneNumber> phoneNumbers;
    private List<String> emails;

    // getters and setters
}

class Address {
    private String street;
    private String city;
    private String state;
    private String zip;

    // getters and setters
}

class PhoneNumber {
    private String type;
    private String number;

    // getters and setters
}


七、gson和jackson区别

Gson和Jackson都是在Java中处理JSON数据的库,它们都有自己的优点和适用场景。

以下是Gson和Jackson的主要区别:

  1. 性能:Gson通常比Jackson更快,因为它专注于将Java对象转换为JSON格式,而不是JSON格式转换为Java对象。但是,这种性能优势在处理大型数据集时可能会减少,因为Jackson在处理大型JSON数据集时更有效率。
  2. 易用性:Gson通常被认为比Jackson更易用,因为它提供了更简单的API和更少的配置选项。但是,Jackson提供了更多的配置选项,使其更灵活,并且它的功能更强大。
  3. 对象映射:Gson支持自定义对象映射规则,这使得它在处理复杂的Java对象时非常方便。而Jackson默认情况下采用JavaBean规范进行对象映射,这可能需要一些额外的配置来实现自定义对象映射。
  4. 处理嵌套JSON:Jackson通常比Gson更适合处理嵌套的JSON数据,因为Jackson支持将JSON解析为一个树状结构,这使得处理嵌套的JSON数据变得更容易。

总之,Gson和Jackson都是非常流行和强大的JSON处理库,它们都有自己的优点和缺点,可以根据实际需求来选择使用哪一个。

八、jackson中的jsonnode

​ 在Jackson中,将JSON解析为一个树状结构可以使用JsonNode类,这个类可以表示JSON数据的任何部分,包括对象、数组、字符串、数字等。JsonNode类提供了许多方法来访问和操作JSON数据,这使得处理嵌套的JSON数据变得更容易。

JsonNode类的一些常用API:

  1. get(String fieldName):获取指定名称的JSON属性,返回JsonNode对象。
  2. get(int index):获取数组的指定元素,返回JsonNode对象。
  3. asText():将JSON节点转换为字符串。
  4. asInt():将JSON节点转换为整数。
  5. asBoolean():将JSON节点转换为布尔值。
  6. has(String fieldName):检查是否存在指定名称的JSON属性。
  7. isArray():检查该节点是否为数组。
  8. isObject():检查该节点是否为对象。
  9. size():获取该节点的大小(对于数组是元素个数,对于对象是属性个数)。
import com.fasterxml.jackson.databind.*;

public class JsonNodeExample {
    public static void main(String[] args) throws JsonProcessingException {
        String jsonString = "{\n" +
                "    \"name\": \"John\",\n" +
                "    \"age\": 30,\n" +
                "    \"address\": {\n" +
                "        \"street\": \"123 Main St\",\n" +
                "        \"city\": \"New York\",\n" +
                "        \"state\": \"NY\",\n" +
                "        \"zip\": \"10001\"\n" +
                "    },\n" +
                "    \"phoneNumbers\": [\n" +
                "        {\n" +
                "            \"type\": \"home\",\n" +
                "            \"number\": \"555-1234\"\n" +
                "        },\n" +
                "        {\n" +
                "            \"type\": \"work\",\n" +
                "            \"number\": \"555-5678\"\n" +
                "        }\n" +
                "    ],\n" +
                "    \"emails\": [\n" +
                "        \"john@example.com\",\n" +
                "        \"john.doe@example.com\"\n" +
                "    ]\n" +
                "}";
        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode rootNode = objectMapper.readTree(jsonString);

        JsonNode nameNode = rootNode.get("name");
        String name = nameNode.asText();
        System.out.println("Name: " + name);

        JsonNode ageNode = rootNode.get("age");
        int age = ageNode.asInt();
        System.out.println("Age: " + age);

        JsonNode addressNode = rootNode.get("address");
        String street = addressNode.get("street").asText();
        System.out.println("Street: " + street);
        String city = addressNode.get("city").asText();
        System.out.println("City: " + city);
        String state = addressNode.get("state").asText();
        System.out.println("State: " + state);
        String zip = addressNode.get("zip").asText();
        System.out.println("Zip: " + zip);

        JsonNode phoneNumbersNode = rootNode.get("phoneNumbers");
        boolean isPhoneNumbersArray = phoneNumbersNode.isArray();
        System.out.println("Is phoneNumbers an array? " + isPhoneNumbersArray);
        int phoneNumbersSize = phoneNumbersNode.size();
        System.out.println("Phone numbers size: " + phoneNumbersSize);
        JsonNode firstPhoneNumberNode = phoneNumbersNode.get(0);
        String homePhoneNumber = firstPhoneNumberNode.get("number").asText();
        System.out.println("Home phone number: " + homePhoneNumber);

        JsonNode emailsNode = rootNode.get("emails");
        boolean isEmailsArray = emailsNode.isArray();
        System.out.println("Is emails an array? " + isEmailsArray);
        int emailsSize = emailsNode.size();
        System.out.println("Emails size: " + emailsSize);
        String email1 = emailsNode.get(0).asText();
        System.out.println("Email 1: " + email1);
        String email2 = emailsNode.get(1).asText();
        System.out.println("Email 2: " + email2);
    }
}

九、fastJson

Fastjson是一个Java语言的高性能JSON处理库,由阿里巴巴公司开源发布。它提供了一组简单而强大的API来处理JSON数据,能够实现快速的JSON序列化和反序列化,支持Java对象和JSON数据之间的互相转换。

Fastjson还提供了许多高级功能,例如支持自定义序列化和反序列化规则、支持Java泛型和循环引用、支持JSON和JavaBean之间的深度转换等。由于其高性能和强大的功能,Fastjson在许多Java应用程序中被广泛使用。

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

public class Main {
    public static void main(String[] args) {
        String jsonString = "{\"name\":\"Tom\",\"age\":20,\"address\":{\"street\":\"123 Main St\",\"city\":\"New York\",\"state\":\"NY\"},\"phoneNumbers\":[{\"type\":\"home\",\"number\":\"123-456-7890\"},{\"type\":\"work\",\"number\":\"111-222-3333\"}]}";

        // 将JSON字符串解析为JSONObject对象
        JSONObject jsonObj = JSON.parseObject(jsonString);

        // 从JSONObject中获取属性值
        String name = jsonObj.getString("name");
        int age = jsonObj.getIntValue("age");

        JSONObject address = jsonObj.getJSONObject("address");
        String street = address.getString("street");
        String city = address.getString("city");
        String state = address.getString("state");

        JSONArray phoneNumbers = jsonObj.getJSONArray("phoneNumbers");
        for (int i = 0; i < phoneNumbers.size(); i++) {
            JSONObject phone = phoneNumbers.getJSONObject(i);
            String type = phone.getString("type");
            String number = phone.getString("number");
            System.out.println(type + ": " + number);
        }
    }
}


Fastjson提供了丰富的API,以下是其中一些常用的API:

  1. JSON.parseObject(String text, Class<T> clazz):将JSON字符串解析为Java对象,第一个参数是要解析的JSON字符串,第二个参数是要转换的Java类。
  2. JSON.toJSONString(Object object):将Java对象转换为JSON字符串。
  3. JSONObject:Fastjson提供了一个JSONObject类来表示JSON对象,它可以像Java Map一样存储和获取属性。
  4. JSONArray:Fastjson提供了一个JSONArray类来表示JSON数组,它可以像Java List一样存储和获取元素。
  5. JSON.parseArray(String text, Class<T> clazz):将JSON字符串解析为Java List。
  6. JSON.parseObject(String text):将JSON字符串解析为JSONObject对象。
  7. JSON.parse(String text):将JSON字符串解析为Java对象,返回值类型为Object。
  8. JSONValidator:Fastjson提供了一个JSONValidator类,用于验证JSON字符串的合法性。
  9. JSONPath:Fastjson提供了一个JSONPath类,用于从JSON对象或JSON字符串中提取数据。
  10. SerializerFeature:Fastjson提供了一个SerializerFeature枚举类,用于设置序列化特性,例如禁止循环引用检测、格式化输出等。

以上是Fastjson一些常用的API,你可以根据具体需求选择使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值