2024-08-14

在JavaScript中,可以使用JSON.stringify()方法将对象序列化为JSON字符串,使用JSON.parse()方法将JSON字符串解析为对象。

示例代码:




// 创建一个对象
const obj = {
  name: "张三",
  age: 30,
  city: "北京"
};
 
// 序列化对象为JSON字符串
const jsonString = JSON.stringify(obj);
console.log(jsonString); // 输出: '{"name":"张三","age":30,"city":"北京"}'
 
// 解析JSON字符串为对象
const parsedObj = JSON.parse(jsonString);
console.log(parsedObj); // 输出: { name: '张三', age: 30, city: '北京' }

JSON.stringify()可以接受一个replacer函数作为第二个参数,该函数可以用来修改序列化结果;接受一个space参数作为第三个参数,用于指定输出的JSON字符串的缩进格式,从而提高可读性。




// 使用replacer函数
const jsonStringWithReplacer = JSON.stringify(obj, (key, value) => {
  if (key === 'name') {
    return '李四';
  }
  return value;
});
console.log(jsonStringWithReplacer); // 输出: '{"name":"李四","age":30,"city":"北京"}'
 
// 使用space参数
const jsonStringWithSpace = JSON.stringify(obj, null, 2);
console.log(jsonStringWithSpace);
/* 输出: 
{
  "name": "张三",
  "age": 30,
  "city": "北京"
}
*/
2024-08-14

在Python和Node.js之间进行通信时,可以使用http模块(Node.js)来创建一个服务器端点,并使用Python的requests库来发送JSON数据。

Python端代码(使用requests库):




import requests
import json
 
# 要发送的数据
data = {
    'message': 'Hello from Python',
    'type': 'greeting'
}
 
# Node.js服务器的URL
url = 'http://localhost:3000/receive'
 
# 发送POST请求
response = requests.post(url, json=data)
 
# 打印响应内容
print(response.text)

Node.js端代码(使用http模块和express框架):




const express = require('express');
const app = express();
const port = 3000;
 
app.use(express.json()); // Middleware for parsing JSON bodies
 
app.post('/receive', (req, res) => {
  const jsonData = req.body;
  console.log('Received data:', jsonData);
  // 处理jsonData...
  res.send('Data received');
});
 
app.listen(port, () => {
  console.log(`Server listening at http://localhost:${port}`);
});

确保先运行Node.js服务器,然后运行Python客户端代码以发送数据。这个例子演示了如何在两个语言之间发送和接收JSON数据。

2024-08-14



<template>
  <div>
    <button @click="printHtml">打印HTML</button>
    <button @click="printPdf">打印PDF</button>
    <button @click="printJson">打印JSON</button>
    <button @click="printImage">打印图片</button>
  </div>
</template>
 
<script>
import printJS from 'print-js';
 
export default {
  methods: {
    printHtml() {
      printJS({
        printable: 'html-element-id', // 需要打印的HTML元素的ID
        type: 'html',
        targetStyles: ['*'] // 打印时包含所有样式
      });
    },
    printPdf() {
      printJS({
        printable: 'http://someurl/path/to/pdf/file.pdf', // PDF文件的URL
        type: 'pdf',
      });
    },
    printJson() {
      printJS({
        printable: { key1: 'value1', key2: 'value2' }, // 需要打印的JSON对象
        type: 'json',
      });
    },
    printImage() {
      printJS({
        printable: 'http://someurl/path/to/image/file.jpg', // 图片文件的URL
        type: 'image',
      });
    }
  }
}
</script>

这个代码示例展示了如何在Vue 2应用程序中使用Print.js库来打印不同类型的内容。printHtml, printPdf, printJson, 和 printImage 方法分别用于打印HTML元素、PDF文件、JSON对象和图片。每个方法都通过调用printJS函数并传递一个包含printable属性和类型的配置对象来实现打印功能。

2024-08-14

要使用Scrapy-Selenium来爬取豆瓣电影的Ajax、JSON或XML数据,你需要安装Scrapy-Selenium,并编写一个Spider来使用Selenium WebDriver加载页面,并提取所需的数据。以下是一个简单的例子:

  1. 安装Scrapy-Selenium:



pip install scrapy-selenium
  1. 确保你有一个Selenium WebDriver,例如ChromeDriver或GeckoDriver。
  2. 创建一个Scrapy项目和Spider:



scrapy startproject dym_crawler
cd dym_crawler
scrapy genspider dym_spider dym.com
  1. 编辑dym_crawler/spiders/dym_spider.py来使用Selenium:



import json
import scrapy
from scrapy_selenium import SeleniumRequest
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
 
class DymSpider(scrapy.Spider):
    name = 'dym_spider'
    allowed_domains = ['douban.com']
    start_urls = ['https://movie.douban.com/']
 
    def start_requests(self):
        # 使用SeleniumRequest替代原生的Scrapy Request
        yield SeleniumRequest(
            self.parse_ajax,
            url='https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=0&limit=20',
            callback=self.parse,
            wait_until=EC.presence_of_element_located((By.CSS_SELECTOR, 'div.indent'))
        )
 
    def parse_ajax(self, response):
        # 解析Ajax响应内容
        data = json.loads(response.text)
        for movie in data.get('data', []):
            yield {
                'title': movie.get('title'),
                'rating': movie.get('rating'),
                'url': movie.get('url')
            }
 
    def parse(self, response):
        # 解析页面内容
        # 这里你可以提取其他你需要的数据
        pass

在上面的代码中,SeleniumRequest会启动一个Selenium会话,加载页面,并等待直到指定的条件被满足才会继续执行回调函数。在这个例子中,我们等待电影列表出现在页面上,然后解析Ajax响应内容。

确保你的Selenium WebDriver配置正确,并且在运行Spider之前启动了Selenium服务。如果你想要爬取其他类型的数据(如JSON或XML),你可以根据页面上数据的来源调整XPath或CSS选择器来提取数据。

2024-08-14



<template>
  <div class="bin-code-editor">
    <codemirror v-model="editorValue" :options="editorOptions"></codemirror>
  </div>
</template>
 
<script>
import { codemirror } from 'vue-codemirror-lite'
import 'codemirror/lib/codemirror.css'
import 'codemirror/mode/javascript/javascript'
 
export default {
  components: {
    codemirror
  },
  data() {
    return {
      editorValue: '',
      editorOptions: {
        mode: 'application/json',
        theme: 'base16-dark',
        lineNumbers: true,
        lineWrapping: true,
        foldGutter: true,
        gutters: ['CodeMirror-linenumbers', 'CodeMirror-foldgutter'],
        styleActiveLine: true,
        matchBrackets: true,
        autoCloseBrackets: true,
        matchTags: true,
        autoRefresh: true
      }
    }
  },
  methods: {
    formatJson() {
      try {
        const formattedJson = JSON.stringify(JSON.parse(this.editorValue), null, 2);
        this.editorValue = formattedJson;
      } catch (e) {
        console.error('Error formatting JSON:', e);
      }
    }
  }
}
</script>
 
<style>
.bin-code-editor {
  height: 100%;
  position: relative;
}
</style>

这个代码实例展示了如何在Vue应用中集成vue-codemirror-lite组件,并实现了一个简单的JSON编辑器。通过formatJson方法,用户可以轻松地格式化JSON代码。这个例子提供了基本的错误处理,以防输入的JSON无法解析。

2024-08-14



// manifest.json 中配置代理
{
  ...
  "h5" : {
    "devServer" : {
      "port": 8080,
      "proxy" : {
        "/api": {
          "target": "http://backend.example.com",
          "changeOrigin": true,
          "secure": false,
          "pathRewrite": {
            "^/api": ""
          }
        }
      }
    }
  }
  ...
}



// vue.config.js 中配置代理
module.exports = {
  devServer: {
    proxy: {
      '/api': {
        target: 'http://backend.example.com',
        changeOrigin: true,
        pathRewrite: {
          '^/api': ''
        }
      }
    }
  }
};

以上代码示例展示了如何在manifest.jsonvue.config.js中配置代理,使得在开发环境下运行的UniApp项目可以通过代理服务器访问不同域的后端API。这有助于解决开发过程中的跨域问题,并允许开发者在本地进行调试。

2024-08-13

MyBatis-Plus 本身不直接支持 MySQL 的 JSON 类型字段,但你可以通过自定义类型处理器(TypeHandler)来实现。

以下是一个简单的例子,演示如何为 MySQL 的 JSON 类型字段创建一个自定义类型处理器:




import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.parsers.IbatisSqlSessionFactoryBean;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.annotations.Mapper;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.sql.*;
 
@Mapper
public interface YourEntityMapper extends BaseMapper<YourEntity> {
    // Your mapper methods here
}
 
@Component
public class JsonTypeHandler<T> extends BaseTypeHandler<T> {
    private static final ObjectMapper objectMapper = new ObjectMapper();
    private Class<T> type;
 
    public JsonTypeHandler(Class<T> type) {
        if (type == null) throw new IllegalArgumentException("Type argument cannot be null");
        this.type = type;
    }
 
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, toJSON(parameter));
    }
 
    @Override
    public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return toObject(rs.getString(columnName), type);
    }
 
    @Override
    public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return toObject(rs.getString(columnIndex), type);
    }
 
    @Override
    public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return toObject(cs.getString(columnIndex), type);
    }
 
    private String toJSON(T object) {
        try {
            return objectMapper.writeValueAsString(object);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
 
    private T toObject(String json, Class<T> clazz) {
        if (json == null || json.length() == 0) {
      
2024-08-13



package main
 
import (
    "encoding/json"
    "fmt"
)
 
// 定义一个结构体
type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}
 
func main() {
    // 创建一个Person实例
    p := Person{
        Name: "张三",
        Age:  30,
    }
 
    // 结构体转换为JSON
    jsonBytes, err := json.Marshal(p)
    if err != nil {
        fmt.Println("转换为JSON时发生错误:", err)
        return
    }
    fmt.Println("结构体转换为JSON:", string(jsonBytes))
 
    // JSON转换为结构体
    var personFromJSON Person
    err = json.Unmarshal(jsonBytes, &personFromJSON)
    if err != nil {
        fmt.Println("转换为结构体时发生错误:", err)
        return
    }
    fmt.Printf("JSON转换为结构体: %+v\n", personFromJSON)
}

这段代码首先定义了一个Person结构体,并包含了两个字段NameAge,并使用json标签指定了JSON中的字段名。然后创建了一个Person实例,并使用json.Marshal函数将其转换为JSON字节切片。之后,它使用json.Unmarshal函数将JSON字节切片转换回Person结构体实例。在转换过程中,它还会处理可能发生的错误。

2024-08-13



package main
 
import (
    "encoding/json"
    "fmt"
)
 
func main() {
    // 定义一个结构体,用于序列化和反序列化
    type Message struct {
        Name string
        Body string
        Time int64
    }
 
    // 创建一个Message实例
    m := Message{"Alice", "Hello", 1294706398881547000}
 
    // 序列化:结构体转换为JSON字符串
    jsonData, err := json.Marshal(m)
    if err != nil {
        fmt.Println("error:", err)
    }
    fmt.Println(string(jsonData))
 
    // 反序列化:JSON字符串转换为结构体
    var result Message
    if err := json.Unmarshal(jsonData, &result); err != nil {
        fmt.Println("error:", err)
    }
    fmt.Printf("%+v\n", result)
}

这段代码首先定义了一个结构体Message,然后创建了该结构体的一个实例,并使用json.Marshal函数将其序列化为JSON字符串。接着,它使用json.Unmarshal函数将JSON字符串反序列化回结构体,并打印出结果。这个过程展示了如何在Go语言中处理JSON数据。

2024-08-13



package main
 
import (
    "encoding/json"
    "fmt"
    "log"
)
 
// 定义一个结构体来映射JSON数据
type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}
 
func main() {
    // 创建一个Person实例
    person := Person{
        Name: "John Doe",
        Age:  30,
    }
 
    // 序列化为JSON
    jsonBytes, err := json.Marshal(person)
    if err != nil {
        log.Fatalf("JSON marshaling failed: %s", err)
    }
    jsonStr := string(jsonBytes)
 
    // 打印序列化后的JSON字符串
    fmt.Printf("JSON representation: %s\n", jsonStr)
 
    // 反序列化JSON到结构体
    var p Person
    if err := json.Unmarshal(jsonBytes, &p); err != nil {
        log.Fatalf("JSON unmarshaling failed: %s", err)
    }
 
    // 打印反序列化后的结构体内容
    fmt.Printf("Back to Go: name: %s, age: %d\n", p.Name, p.Age)
}

这段代码展示了如何在Go中使用encoding/json包来处理JSON数据。首先定义了一个结构体Person来映射JSON数据,然后创建了一个Person实例,将其序列化为JSON字符串,并打印出来。接着,代码演示了如何将JSON字符串反序列化回Person结构体实例,并打印出结构体内容。这个过程展示了Go语言中处理JSON的基本方法。