15/7/24/JSON/DATA/MAP/泛型

本文介绍了Java中JSON的构造方法,强调了导入相关json包的重要性,并展示了如何使用JSONObject和JSONArray。此外,还探讨了DATA类的过时及Calendar类的使用,以及Format类的简单应用。在集合和Map部分,讲解了List、Set和Map的基本操作,最后阐述了泛型集合在解决类型转换问题上的作用。

JSON的应用

DATA类

CollectionAndMap

泛型

JSON的构造

1.JSON的构造在java里面需要导入有关json的包
2.JSON的构造比较简单,只需要构建一个JSONObject就相当于构建完成了利用put方法将内容写进去;利用add方法向JSON数组添加内容

    public static String creatJSON(){
        JSONObject obj=new JSONObject();
        obj.put("name", "张三");
        JSONObject obj2=new JSONObject();
        obj2.put("name", "李四");
        JSONObject obj3=new JSONObject();
        obj3.put("name", "王五");
        JSONArray array=new JSONArray();
        array.add(obj);
        array.add(obj2);
        array.add(obj3);
        JSONObject clazz=new JSONObject();
        clazz.put("clazzname", "一年级一班");
        clazz.put("num", "3");
        clazz.put("student", array);//将数组array的内容放入到student中
        System.out.println(clazz.toString());//打印clazz中的字符内容
        return clazz.toString();
    public static String creatJSONObject(){
        Student zhangsan=new Student(20,"张三");//一个Student类,数据的输入
        Student lisi=new Student(20,"李四");
        Student wangwu=new Student(20,"王五");
        Student zhaoliu=new Student(20,"赵六");
        JSONObject obj=new JSONObject();//定义一个JSONObject
        JSONArray array=new JSONArray();//定义一个JSONArray
        array.add(zhangsan);//将Student类对象添加到JSONArray的数组里面
        array.add(lisi);
        array.add(wangwu);
        array.add(zhaoliu);
        obj.put("clazz", array);//将数组放到clazz里面
        System.out.println(obj.toString());
        return obj.toString();
    }

3.输出JSON中内容的一般方法

public static void main(String[] args) {
//      File file=new File("e:\\22.txt");
        String json01=creatJSONObject();
        String json=creatJSON();//构建一个JSON文档
        if (null!=json) {
            JSONObject clazz=JSONObject.fromObject(json);//定义一个名为clazz的JSONObject其数据来源是json文件
            System.out.println(clazz.getString("clazzname"));//打印clazzname中的内容
            JSONArray array=clazz.getJSONArray("student");//打印数组student中的内容
            for (int i = 0; i < array.size(); i++) {
                JSONObject obj=array.getJSONObject(i);//将数组里面的内容重新导入到一个JSONObject中
                System.out.println(obj.getString("name"));
            }
        }
    }

DATA类

1.data类大部分已经过时了,现在常用的是Calendar类
2.由于Calendar类属于抽象类,不能直接构建对象,因此可以利用getInstance方法来得到一个对象
3.Calendar类的一般用法如下

public static void main(String[] args) {
    Date date=new Date();
    System.out.println(date.getTime());//返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数
//Calendar是抽象类  getInstance使用默认时区和语言环境获得一个日历。
    Calendar calendar=Calendar.getInstance();
    System.out.println(calendar.get(calendar.HOUR_OF_DAY));
    System.out.println(calendar.get(calendar.MONTH));
    System.out.println(calendar.get(calendar.YEAR));
    System.out.println(calendar.get(calendar.DAY_OF_MONTH));
    calendar.add(calendar.DAY_OF_MONTH, 50);
    System.out.println(calendar.get(calendar.DAY_OF_MONTH));
}
format类的简单应用

1.由于Format类属于抽象类,所以可以利用public子类构建对象
2.构建的对象是以自己定义的格式对时间进行规范、
3.parse解析的内容必须是按照自己规定好的格式写的。否则系统会报错

    Date date=new Date();
//  定义format的格式为"kk:mm:ss MM/dd/yyyy"
    SimpleDateFormat format=new SimpleDateFormat("kk:mm:ss MM/dd/yyyy");
    System.out.println(format.format(date));// 将给定的 Date 格式化为日期/时间字符串,并将结果添加到给定的 StringBuffer
    String s="11:39:12 07/24/2015";
//  String s="07/24/2015 11:39:12 ";//系统会报错,错误提示Unknown source
    try {
        Date date1=format.parse(s);//解析字符串s中的格式依据是自己定义的格式"kk:mm:ss MM/dd/yyyy"
        System.out.println(date1.getDate());
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

CollectionAndMap的关系图

CollectionAndMap

List的简单应用
public static void main(String[] args) {
        List<Student> students = new ArrayList<Student>();//构建一个list的的数组类型为Student
        Student zhangsan = new Student(20, "张三");
        Student lisi = new Student(25, "李四");
        Student wangwu = new Student(28, "王五");
        Student zhaoliu = new Student(30, "赵六");
        Student maqi = new Student(10, "马齐");
        students.add(zhangsan);
        students.add(lisi);
        students.add(wangwu);
        students.add(zhaoliu);
        students.add(maqi);
        //  这两个for循环的功能是一样的
        //  for (int i = 0; i < students.size(); i++) {
        //      Student s=students.get(i);//返回列表中指定的值
        //      System.out.println("年龄"+s.getAge()+"姓名"+s.getName());
        //  }
        for (Student student : students) {
            System.out.println("年龄" + student.getAge() + "姓名" + student.getName());
        }
//      按照年龄的大小进行排序
//      比冒泡排序法的作用大多了
        Collections.sort(students, new MyCompare());//根据指定比较器产生的顺序对指定列表进行排序
        for (Student student : students) {
            System.out.println("年龄" + student.getAge() + "姓名" + student.getName());
        }

    }
Set的简单应用
    public static void main(String[] args) {
        HashSet<Integer> set=new HashSet<Integer>();
        Random random=new Random();
        while(set.size()<10){
            int i=random.nextInt(90)+10;
            set.add(i);//由于是hashset编码,重复的部分不会被添加进去。
        }
//  由于HashSet中没有get函数因此只能用迭代的方式来打印里面的内容 
        Iterator it=set.iterator();//返回对此 set 中元素进行迭代的迭代器
        while(it.hasNext()){//hasnext的作用是  如果仍有元素可以迭代,则返回 true。
            System.out.println(it.next());
        }
    }
Map的简单应用
HashMap<String, String> counties=new HashMap<String, String>();
        counties.put("CN", "中国");
        counties.put("USA", "美国");
        counties.put("JP", "日本");
        counties.put("UK", "英国");
        System.out.println(counties.get("USA"));//由于map是

        HashMap<String, Student> clazz=new HashMap<String, Student>();
         clazz.put("zhangsan", new Student(22,"张三") );
         clazz.put("lisi", new Student(22,"李四") );
         clazz.put("wangwu", new Student(22,"王五") );
         clazz.put("zhaoliu", new Student(22,"赵六") );
         Set<String>  key=clazz.keySet();//返回此映射中所包含的键的 Set 视图。
         Iterator<String> it=key.iterator();//返回在此 set 中的元素上进行迭代的迭代器
         while(it.hasNext()){
             String keys=it.next();//it.next只能用一次。因为运行一次就返回下一个元素
             System.out.println(keys+"-----"+clazz.get(keys).getName());
         }
    }

泛型集合解决的主要问题

1.把任何类型对象通过add(Object obj)放入List中,认为只是Object类型
2.通过get(int index)取出List中元素时必须进行强制类型转换,繁琐而且容易出现异常
3.使用Map的put(Object key,Object value)和get(Object key)存取对象时存在同样的问题
4.使用Iterator的next()方法获取元素时存在同样的问题

    public static void main(String[] args) {
//  声明一个Student类中含有泛类《Cat》
    Student<Cat> zhangsan=new Student<Cat>();
    Cat tom=new Cat();
    zhangsan.setPet(tom);
    zhangsan.getPet();
    Student<Dog> lisi=new Student<>();
    lisi.setPet(new Dog());
    Student<Pet> wangwu=new Student<>();
    wangwu.setPet(new Pet());

    public class Student<T> {
    private T  pet;
    public T getPet() {
        return pet;
    }
    public void setPet(T pet) {
        this.pet = pet;
    }
<think> 我们讨论的是如何在TypeScript项目中使用@types/react。当在TypeScript项目中集成React时,通常需要安装相应的类定义包(@types/react和@types/react-dom)来获得React库的类支持。 常见问题包括: 1. 如何安装和配置@types/react? 2. 如何解决类冲突或版本不匹配问题? 3. 如何为函数组件和类组件编写类? 下面将详细说明如何正确使用@types/react。 ### 1. 安装依赖 首先,确保已经安装了React和TypeScript,然后安装类定义包: ```bash # 使用npm npm install react react-dom npm install --save-dev typescript @types/react @types/react-dom # 使用yarn yarn add react react-dom yarn add --dev typescript @types/react @types/react-dom ``` ### 2. 配置tsconfig.json 确保tsconfig.json中包含以下基本配置: ```json { "compilerOptions": { "jsx": "react", // 处理JSX "module": "esnext", // 或 "commonjs" "target": "es6", "lib": ["dom", "dom.iterable", "esnext"], "strict": true, "esModuleInterop": true, // 允许合成默认导入 "skipLibCheck": true // 跳过类库的检查,避免一些兼容性问题 }, "include": ["src/**/*"] // 根据项目结构调整 } ``` ### 3. 创建React组件 下面是一个使用TypeScript的函数组件示例,展示了如何为props定义类: ```typescript // src/components/Hello.tsx import React from 'react'; // 定义props类 interface HelloProps { name: string; age?: number; // 可选属性 } // 函数组件 const Hello: React.FC<HelloProps> = ({ name, age = 18 }) => { return ( <div> <h1>Hello, {name}!</h1> <p>You are {age} years old.</p> </div> ); }; export default Hello; ``` ### 4. 类组件示例 类组件的写法: ```typescript // src/components/ClassComponent.tsx import React, { Component } from 'react'; interface ClassComponentProps { message: string; } interface ClassComponentState { count: number; } class ClassComponent extends Component<ClassComponentProps, ClassComponentState> { state: ClassComponentState = { count: 0 }; increment = () => { this.setState(prevState => ({ count: prevState.count + 1 })); }; render() { return ( <div> <p>{this.props.message}</p> <p>Count: {this.state.count}</p> <button onClick={this.increment}>Increment</button> </div> ); } } export default ClassComponent; ``` ### 5. 处理常见类问题 **问题1:类“JSX.IntrinsicElements”上不存在属性“xxx”** 当使用自定义的JSX标签时,需要定义其类。在全局类定义文件中(如:src/global.d.ts)添加: ```typescript declare namespace JSX { interface IntrinsicElements { 'my-custom-element': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>; } } ``` **问题2:事件处理函数的类** 例如,按钮点击事件: ```typescript const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => { console.log('Button clicked!', event.currentTarget); }; ``` ### 6. 版本冲突处理 如果遇到类版本不匹配(如React 18与@types/react17的冲突),可以通过以下步骤解决: ```bash # 查看当前安装的版本 npm list @types/react # 安装指定版本(例如,与React 18对应的版本) npm install @types/react@18.0.0 ``` 或者使用`resolutions`字段(在yarn中)来锁定版本: ```json // package.json "resolutions": { "@types/react": "^18.0.0", "@types/react-dom": "^18.0.0" } ``` ### 7. 使用Hooks时的类 例如,使用useState: ```typescript const [count, setCount] = useState<number>(0); // 明确指定类为number ``` ### 8. 组件 如果需要编写组件,可以这样实现: ```typescript interface ListProps<T> { items: T[]; renderItem: (item: T) => React.ReactNode; } function List<T>(props: ListProps<T>) { return <div>{props.items.map(props.renderItem)}</div>; } // 使用 <List<number> items={[1,2,3]} renderItem={(item) => <div key={item}>{item}</div>} /> ``` --- ### 总结 以上步骤涵盖了在TypeScript项目中使用@types/react的基本配置、组件编写和常见问题处理。通过类定义,可以大大提高React组件的可维护性和开发效率。 §§相关问题§§: 1. 如何在TypeScript中正确地使用React Context? 2. 如何为React Hooks(如useReducer)添加类? 3. 如何处理高阶组件(HOC)的类? 4. 在TypeScript中如何扩展React组件的props? </think> ### 在 TypeScript 项目中使用 `@types/react` 当在 TypeScript 项目中结合 React 使用时,`@types/react` 提供了 React 库的完整类定义。以下是正确使用和解决常见问题的方法: #### 1. 安装必需依赖 ```bash # 安装 React 核心库和类定义 npm install react react-dom npm install --save-dev typescript @types/react @types/react-dom # 指定版本安装(推荐) npm install --save-dev @types/react@18.2.21 @types/react-dom@18.2.10 ``` #### 2. 配置 tsconfig.json 添加必要的编译器选项: ```json { "compilerOptions": { "jsx": "react-jsx", // 处理JSX语法 "lib": ["dom", "es2019"], // 浏览器环境支持 "moduleResolution": "node", "strict": true, // 启用严格类检查 "esModuleInterop": true, // 改进CommonJS兼容性 "skipLibCheck": true, // 跳过类库检查 "types": ["react", "react-dom"] // 包含React类定义 }, "include": ["src/**/*"] } ``` #### 3. 创建类安全的 React 组件 函数组件示例: ```typescript // src/components/Button.tsx import React, { FC, ButtonHTMLAttributes } from 'react'; interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> { variant?: 'primary' | 'secondary'; size?: 'sm' | 'md' | 'lg'; } const Button: FC<ButtonProps> = ({ variant = 'primary', size = 'md', children, ...rest }) => { const baseClasses = "font-medium rounded-lg transition-colors"; const variantClasses = variant === 'primary' ? "bg-blue-600 hover:bg-blue-700 text-white" : "bg-gray-200 hover:bg-gray-300 text-gray-800"; const sizeClasses = { sm: "text-sm py-1.5 px-3", md: "text-base py-2 px-4", lg: "text-lg py-2.5 px-5" }[size]; return ( <button className={`${baseClasses} ${variantClasses} ${sizeClasses}`} {...rest} > {children} </button> ); }; export default Button; ``` 类组件示例: ```typescript // src/components/Counter.tsx import React, { Component } from 'react'; interface CounterProps { initialCount?: number; } interface CounterState { count: number; } class Counter extends Component<CounterProps, CounterState> { constructor(props: CounterProps) { super(props); this.state = { count: props.initialCount || 0 }; } increment = () => { this.setState(prev => ({ count: prev.count + 1 })); }; decrement = () => { this.setState(prev => ({ count: Math.max(0, prev.count - 1) })); }; render() { return ( <div className="flex items-center gap-4"> <button onClick={this.decrement} className="text-2xl">-</button> <span className="text-xl font-mono">{this.state.count}</span> <button onClick={this.increment} className="text-2xl">+</button> </div> ); } } export default Counter; ``` #### 4. 解决常见类错误 **问题1:属性不存在于类上** ```typescript // 错误:Property 'isLoading' does not exist on type 'IntrinsicAttributes & Props' <Button isLoading={true}>Submit</Button> // 修复:扩展组件Props接口 interface ButtonProps { isLoading?: boolean; // ...其他属性 } ``` **问题2:Hooks 类错误** ```typescript const [user, setUser] = useState(null); // 错误:user可能为null // 修复1:提供初始类 const [user, setUser] = useState<User | null>(null); // 修复2:使用类断言 const [user, setUser] = useState<User>({} as User); ``` **问题3:事件处理程序类** ```typescript // 正确的事件类 const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => { console.log(e.target.value); }; const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => { e.preventDefault(); }; ``` #### 5. 自定义 Hook 类 ```typescript import { useState, useEffect } from 'react'; function useFetch<T>(url: string): [T | null, boolean, Error | null] { const [data, setData] = useState<T | null>(null); const [loading, setLoading] = useState(true); const [error, setError] = useState<Error | null>(null); useEffect(() => { const fetchData = async () => { try { const response = await fetch(url); const result = await response.json() as T; setData(result); } catch (err) { setError(err as Error); } finally { setLoading(false); } }; fetchData(); }, [url]); return [data, loading, error]; } // 使用示例 interface User { id: number; name: string; email: string; } const UserProfile = () => { const [user, loading, error] = useFetch<User>('/api/user/1'); if (loading) return <div>Loading...</div>; if (error) return <div>Error: {error.message}</div>; return ( <div> <h2>{user!.name}</h2> <p>Email: {user!.email}</p> </div> ); }; ``` #### 6. 版本冲突解决方案 当遇到类冲突时: ```json // package.json { "resolutions": { "@types/react": "18.2.21", "@types/react-dom": "18.2.10" } } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值