来了解一下ASN.1?

想要了解证书,必须先了解ASN.1和编码规则。这篇文章简单介绍ASN.1,不过分探讨细节,大家如果有兴趣可以继续深入研究。

一、ASN.1

ASN.1是Abstract Syntax Notation One(抽象文法描述语言)的缩写。计算机系统之间交换的数据消息如果用ASN.1进行描述,可以减少了双方的沟通成本。

ASN.1作为抽象描述文法,将现有的数据类型抽象描述成近20种数据类型。这些数据类型主要分为两大类:基本类型和结构类型。ASN.1的数据类型几乎概括了现实世界中存在的所有数据类型,具有相当的通用性。

基本类型又称为原子类型,是构成其他结构类型的成员类型,如

  1. 布尔值类型:BOOLEAN

  2. 整型:INTEGER

  3. 字符串:OCTET STRING

  4. 空:NULL

结构类型又称为复合类型,如

  1. 有序成员固定结构:SEQUENCE

  2. 无序成员固定结构:SET

1.1实战

通过一个实例我们看看怎样使用ASN.1。

我们先创建一个ASN1格式的schema,该schema表示用户信息,里面有用户名和用户描述。然后填写数据,将数据进行编解码。大家可以用https://asn1.io/asn1playground/default.aspx来做实验。

1.1.1schema

首先创建改结构对应的ASN.1描述。

--<ASN1.HugeInteger World-Schema.Rocket.range>--
World-Schema DEFINITIONS AUTOMATIC TAGS ::= 
BEGIN
  Rocket ::= SEQUENCE       
  {
     name      UTF8String (SIZE(1..16)),message   UTF8String (SIZE(1..16))
  }                                                     
END

1.1.2设置数据

有了schema后,我们对该结构进行赋值,可以使用ASN.1格式或json格式赋值。

# ASN.1格式
value Rocket ::= {
  name "Falcon",message "hh"
}

# Json
{
  "name":"Falcon","message":"hh"
}

1.1.3编码

然后我们将数据编码为需要的格式,如ber、der、per、uper、oer、coer、xml等,编码结果如下所示:

hh.PDU.ber

hh.PDU.der

hh.PDU.xml

链接: https://pan.baidu.com/s/1Zz8dJCErDe1Fiz57oQF4Pg  密码: 2wdr

1.1.4解码

我们尝试解码der文件,如果没有schema,解析的内容如下图所示:

image-20230115181115540.png


如果有对应的schema,解析出的内容存放在txt或json中:

image-20230115181155854.png

hh.PDU.der.json

hh.PDU.der.txt

链接: https://pan.baidu.com/s/1Zz8dJCErDe1Fiz57oQF4Pg  密码: 2wdr

1.2代码实现

如果用代码,如何实现上述功能呢?本次用php实现,大家需要安装https://github.com/fgrosse/PHPASN1。

代码主要包含4部分内容:

  1. 先对结构进行赋值

  2. 然后将数据进行der编码和base64编码

  3. 编写该结构对应的schema(这个其实可以放在最开始编写)

  4. 将编码后的数据进行解析(支持base64编码或der编码的数据),解析完成后,便可获取各个数据

<?php

#namespace FG\Test\ASN1;

namespace FG\Test\ASN1;

use FG\ASN1\Identifier;
use FG\ASN1\TemplateParser;
use FG\ASN1\Universal\BitString;
use FG\ASN1\Universal\Integer;
use FG\ASN1\Universal\ObjectIdentifier;
use FG\ASN1\Universal\Sequence;
use FG\ASN1\Universal\Set;
use FG\ASN1\Universal\CharacterString;
use FG\ASN1\Universal\UTF8String;

//use PHPUnit_Framework_TestCase;

class TemplateParserTest //extends PHPUnit_Framework_TestCase
{
    public function testParseBase64()
    {
        #1.赋值
        $sequence = new Sequence(
           // new Set(
                //new ObjectIdentifier('ID Number'),new UTF8String("Falcon"),new UTF8String("hh")
           // )
        );

        #2.der编码后,做base64编码
        $data = base64_encode($sequence->getBinary());
        var_dump($sequence->getBinary(),$data);

        #3.schema结构
        $template = [
            Identifier::SEQUENCE => [
               // Identifier::SET => [
                    //Identifier::OBJECT_IDENTIFIER,Identifier::UTF8_STRING,// ]
            ]
        ];

        #4.解析
        $parser = new TemplateParser();
        $object = $parser->parseBase64($data,$template);
        var_dump($object);

        var_dump("-------------");
        var_dump($object->getChildren()[0]->getContent());
        var_dump("-------------");

//        $this->assertInstanceOf(Set::class,$object[0]);
//        $this->assertInstanceOf(ObjectIdentifier::class,$object[0][0]);
//        $this->assertInstanceOf(Sequence::class,$object[0][1]);
//        $this->assertInstanceOf(Integer::class,$object[0][1][0]);
//        $this->assertInstanceOf(BitString::class,$object[0][1][1]);
        $object = $parser->parseBinary($sequence->getBinary(),$template);
        var_dump($object);
    }
}
require_once __DIR__ . '/vendor/autoload.php';
$parse = new TemplateParserTest();
$parse->testParseBase64();

输出如下:

➜  myproject php asn1.php
string(14) "0

             Falcon
                   hh"
string(20) "MAwMBkZhbGNvbgwCaGg="
object(FG\ASN1\Universal\Sequence)#8 (4) {
  ["children":protected]=>
  array(2) {
    [0]=>
    object(FG\ASN1\Universal\UTF8String)#9 (5) {
      ["value":protected]=>
      string(6) "Falcon"
      ["checkStringForIllegalChars":"FG\ASN1\AbstractString":private]=>
      bool(false)
      ["allowedCharacters":"FG\ASN1\AbstractString":private]=>
      array(0) {
      }
      ["contentLength":"FG\ASN1\ASNObject":private]=>
      int(6)
      ["nrOfLengthOctets":"FG\ASN1\ASNObject":private]=>
      int(1)
    }
    [1]=>
    object(FG\ASN1\Universal\UTF8String)#10 (5) {
      ["value":protected]=>
      string(2) "hh"
      ["checkStringForIllegalChars":"FG\ASN1\AbstractString":private]=>
      bool(false)
      ["allowedCharacters":"FG\ASN1\AbstractString":private]=>
      array(0) {
      }
      ["contentLength":"FG\ASN1\ASNObject":private]=>
      int(2)
      ["nrOfLengthOctets":"FG\ASN1\ASNObject":private]=>
      int(1)
    }
  }
  ["iteratorPosition":"FG\ASN1\Construct":private]=>
  int(2)
  ["contentLength":"FG\ASN1\ASNObject":private]=>
  int(12)
  ["nrOfLengthOctets":"FG\ASN1\ASNObject":private]=>
  int(1)
}
string(13) "-------------"
string(6) "Falcon"
string(13) "-------------"
object(FG\ASN1\Universal\Sequence)#11 (4) {
  ["children":protected]=>
  array(2) {
    [0]=>
    object(FG\ASN1\Universal\UTF8String)#12 (5) {
      ["value":protected]=>
      string(6) "Falcon"
      ["checkStringForIllegalChars":"FG\ASN1\AbstractString":private]=>
      bool(false)
      ["allowedCharacters":"FG\ASN1\AbstractString":private]=>
      array(0) {
      }
      ["contentLength":"FG\ASN1\ASNObject":private]=>
      int(6)
      ["nrOfLengthOctets":"FG\ASN1\ASNObject":private]=>
      int(1)
    }
    [1]=>
    object(FG\ASN1\Universal\UTF8String)#13 (5) {
      ["value":protected]=>
      string(2) "hh"
      ["checkStringForIllegalChars":"FG\ASN1\AbstractString":private]=>
      bool(false)
      ["allowedCharacters":"FG\ASN1\AbstractString":private]=>
      array(0) {
      }
      ["contentLength":"FG\ASN1\ASNObject":private]=>
      int(2)
      ["nrOfLengthOctets":"FG\ASN1\ASNObject":private]=>
      int(1)
    }
  }
  ["iteratorPosition":"FG\ASN1\Construct":private]=>
  int(2)
  ["contentLength":"FG\ASN1\ASNObject":private]=>
  int(12)
  ["nrOfLengthOctets":"FG\ASN1\ASNObject":private]=>
  int(1)
}

二、编码规则

ASN.1应用越来越广泛的主要原因之一是这种抽象文法描述与几种标准化编码规则联系在一起。这些编码规则规定了如何在非传输介质下实现ASN.1定义的数据类型与字节流的相互转换。因为编码规则是针对ASN.1的数据类型而制定的,因此可以称这些编码规则为ASN.1的编码规则。

ASN.1的编码规则是把使用ASN.1语言说明的数据转化成一种标准格式的系列规则,同时,保证转换后的数据在任意操作系统中,只要使用相同编码规则的解码器就可以解码获得原始数据。

目前,ASN.1的标准化编码规则有以下几种:BER(Basic Encoding Rules),DER(Distinguished Encoding Rules),PER(Packed Encoding Rules)和CER(Canonical Encoding Rules)等。我们简单介绍一下BER(基本编码规则)和DER(定长编码规则)。

2.1BER

BER编码信息由以下几部分组成:

① 标识串,表示要编码的 ASN.1 类型的标识类和标识码以及使用的编码方法(是简单型还是结构型)。

② 长度串,定长型编码方法中它表示内容串的长度,非定长编码方法中它表示长度不定。

③ 内容串,简单定长型编码方法中它表示要编码类型值的具体内容,结构型编码方法中表示各个成员编码的串联。

④ 内容结束串,只有在结构非定长型编码方法中表示内容串的结束,其他方法中该串省略。

对一个 ASN.1 对象的 BER 编码有三种模式,使用哪一种模式取决于该对象的类型和该类型数据的长度是否已知,

不同模式下编码信息中每个组成部分的编码规则不同。主要为基本类型定长模式、结构类型定长模式、结构类型非定长模式。

hh.PDU.ber

链接: https://pan.baidu.com/s/1Zz8dJCErDe1Fiz57oQF4Pg  密码: 2wdr

2.2DER

DER编码是ASN.1数据类型中具有唯一编码的编码规则。DER编码是BER编码的子集,是将每一个ASN.1抽象对象

类型表示成唯一的1和0码字符串的编码规则。这种编码规则是为需要编码成唯一比特串的应用系统而制定的,特

别是在应用安全技术的应用系统中,由于安全加密技术要求输入数据是字节流的形式,并且是与原数据唯一对应的

字节流,因此需要使用DER编码来实现数据结构的编码。

DER编码称为有关安全技术的应用系统的最佳选择。它基本上继承了BER编码规则,同样,也有三种编码方法。但

为了保证编码结果的唯一性,DER 编码在 BER 编码规则的基础上又附加了一些规则:

① 必须使用定长模式编码。

② 对于内容长度小于127的类型值,长度串编码必须采用短型。

③ 对于内容长度大于128的类型值,长度串编码必须采用长型,同时长度串编码的字节个数必须是最少的。

④ 对于简单字符串类型和从简单字符串类型通过隐式派生得到的类型,必须使用基本类型定长模式编码方法。

⑤ 对于结构类型、从结构类型通过隐式派生得到的类型,以及从任何类型通过显示派生得到的类型,必须使用结

构类型定长模式编码方法。

hh.PDU.der

链接: https://pan.baidu.com/s/1Zz8dJCErDe1Fiz57oQF4Pg  密码: 2wdr

如果Name类型ASN.1描述如下图:

image-20230115223425434.png

将数据使用基本类型定长模式编码后的结果为:

image-20230115223607034.png

三、使用

现在很多内容都使用ASN.1描述,如密码算法、数字证书等。

3.1密码算法ASN.1描述

PKCS #7 v1.5描述了密码消息的通用语法。该语法允许嵌套,如一个数字信封可以包含另一个数字信封,或可以对已做数字信封的数据进行签名;该语法也允许扩展各种属性,还可以用于分发证书和CRL。PKCS #7与PEM兼容,可以直接将加密的消息转换成PEM消息,反之亦然。PKCS #7支持多种基于证书的管理系统,PEM就是其中之一。在RFC 5652中有增强定义。该标准主要包括消息通用语法和6种内容类型(明文、签名、信封、签名信封、摘要、密文)。

① 消息通用语法用ASN.1描述如下:

Contentlnfo::= SEQUENCE{

    contentType ContentType,

    content

    [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL

}

ContentType:= OBJECT IDENTIFIER

② 明文消息内容用ASN.1描述如下:

Data ::= OCTET STRNG

③ 签名消息内容用ASN.1描述如下:

SignedData ::= SEQUENCE {

    version Version,

    digestAlgorithms DigestAlgorithmldentifiers,

    contentInfo Contentlnfo,

    certificates [0] IMPLICIT ExtendedCertificatesAndCertificates

    OPTIONAL,

    Crls [1] IMPLICIT CertificateRevocationLists OPTIONAL,

    signerlnfos Signerlnfos

}

DigestAlgorithmldentifiers ::= SET OF DigestAlgorithmldentifier

Signerlnfos ::= SET OF Signerlnfo

Signerlnfo ::= SEQUENCE {

    version Version,

    issuerAndSeriaINumber IssuerAndSerialNumber,

    digestAlgorithm DigestAlgorithmldentifier,

    authenticatedAttributes [0] IMPLICIT Attributes OPTIONA L,

    digestEncryptionAlgorithm DigestEncryptionAIgorithmldentitler,

    encryptedDigest EncryptedDigest,

    unauthenticatedAttributes [1] IMPLJC.IT Attributes OPTIONAL

}

EncryptedDigest ::= OC.TET STRING

Digestlnfo ::= SEQUENCE {

    digestAlgorithum DigestAlgorithmldentifier,

    digest Digest

}

Digest ::= OCTET STRING

④ 信封消息内容用ASN.1描述如下:

EnvelopedData ::= SEQUENCE {

    version Version,

    recipientlnfos Recipientlnfos.

    encryptedContentlnfo EncryptedContentlnfo

}

Recipientlnlos ::= SET OF Recipientlnfo

EncryptedContentInfo ::= SEQUENCE {

    contentType ContentType,

    contentEncryptionAlgorithm

    ContentEncryptionAlgorithmldentifier,

    encryptedContent [0] IMPLICLT EncryptedContent OPTIONAL

}

EncryptcdContenr ::= OCTET STRING

Recipientlnfo ::= SEQUENCE {

    version Version,

    issuerAndSerialNumber IssuerAndSerialNumber,

    keyEncryptionAlgorithm

    KeyEncryptionAlgorithmldentifier,

    encryptedKey EncryptedKey

}

EncryptedKey ::= OCTET STRING

⑤ 签名信封消息内容用 ASN.1描述如下:

SignedAndEnvelopedData ::= SEQUENCE {

    version Version,

    recipientlnfos Recipientlnfos,

    digestAlgorithms DigestAlgorithmldetifiers,

    encryptedContentlnfo EncryptedComentlnfo,

    certificates [0] IMPLICIT ExtendedCertificatesAndCertificates

    OPTIONAL,

    Crls [1] IMPLICIT CertificateRevocationLists OPTIONAL,

    signerlnfos Signerlnfos

}

⑥ 摘要消息内容用 ASN.1描述如下:

DigestedData ::= SEQUENCE{

    version Version,

    digestAlgorithm DigestAlgorithmldentifier,

    contentlnfo Contentlnfo,

    digest Digest

}

Digest ::= OCTET STRING

⑦ 密文消息内容用ASN.1描述如下:

EncryptedData ::= SEQUENCE {

    version Version,

    encryptedContentlnfo EncryptedContentlnfo

}

3.2数字证书ASN.1描述

X.509数字证书用ASN.1描述如下:

 Certificate ::= SEQUENCE {

  tbsCertificate TBSCertificate,  signatureAlgorithm AlgorithmIdentifier,  signature BIT STRING

  }

  TBSCertificate ::= SEQUENCE {

  version [0] EXPLICIT Version DEFAULT v1,  serialNumber CertificateSerialNumber,  signature AlgorithmIdentifier,  issuer Name,  validity Validity,  subject Name,  subjectPublicKeyInfo SubjectPublicKeyInfo,  issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL,  -- If present,version must be v2or v3

  subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,version must be v2or v3

  extensions [3] EXPLICIT Extensions OPTIONAL

  -- If present,version must be v3

  }

  Version ::= INTEGER {

  v1(0),v2(1),v3(2)

  }

  CertificateSerialNumber ::= INTEGER

  Validity ::= SEQUENCE {

  notBefore CertificateValidityDate,  notAfter CertificateValidityDate

  }

  CertificateValidityDate ::= CHOICE {

  utcTime UTCTime,  generalTime GeneralizedTime

  }

  UniqueIdentifier ::= BIT STRING

  SubjectPublicKeyInfo ::= SEQUENCE {

  algorithm AlgorithmIdentifier,  subjectPublicKey BIT STRING

  }

  Extensions ::= SEQUENCE OF Extension

  Extension ::= SEQUENCE {

  extnID OBJECT IDENTIFIER,  critical BOOLEAN DEFAULT FALSE,  extnValue OCTET STRING
  }

四、总结

通过这篇文章,大家应该能够了解ASN.1的价值和使用方法。

发送/接受方或标准化组织等制定好对应的schema,使用方按照该schema进行赋值,然后将数据转换为ber、der等格式,接收方根据指定的schema进行解析,就能获取到对应数据。

五、资料

  1. ASN.1格式数据编解码总结

  2. ASN.1描述与实例

  3. ASN.1编码方式详解

  4. Golang asn1.Marshal函数代码示例

  5. 高效的5G ASN.1编解码工具

  6. 网页版ASN1解码工具使用教程

  7. https://asn1.io/asn1playground/

  8. 如何解析ASN.1值表示法格式

  9. Go - 解码/编码asn.1

  10. PHPASN1:一个PHP库,用于使用ITU-T X.690编码规则对任意ASN.1结构进行编码和解码-源码下载

  11. php asn.1,A PHP library to encode and decode arbitrary ASN.1 structures using ITU-T X.690 encoding r…

  12. GitHub - fgrosse/PHPASN1: A PHP library to encode and decode arbitrary ASN.1 structures using ITU-T

  13. ThinkPHP5——引用vendor或extend里的第三方类(多种方法)

  14. PKCS规范

  15. x509及其ASN.1表示法

最后

大家如果喜欢我的文章,可以关注我的公众号(程序员麻辣烫)

我的个人博客为:https://shidawuhen.github.io/

往期文章回顾:

  1. 设计模式

  2. 招聘

  3. 思考

  4. 存储

  5. 算法系列

  6. 读书笔记

  7. 小工具

  8. 架构

  9. 网络

  10. Go语言

原文地址:https://blog.csdn.net/shida219/article/details/128700822

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读2.4k次。最近要优化cesium里的热力图效果,浏览了网络上的各种方法,发现大多是贴在影像上的。这么做好是好,但是会被自生添加的模型或者其他数据给遮盖。其次是网上的方法大多数是截取成一个矩形。不能自定义的截取自己所需要的。经过尝试,决定修改下cesium heatmap,让他达到我们需要的要求。首先先下载 cesium heatmap包。其中我们可以看到也是通过叠加entity达到添加canvas的方法绘制到地图上。我们先把这一段代码注释} else {} };
文章浏览阅读1.2w次,点赞3次,收藏19次。在 Python中读取 json文件也可以使用 sort ()函数,在这里我介绍一个简单的示例程序: (4)如果我们想将字符串转换为列表形式,只需要添加一个变量来存储需要转换的字符串即可。在上面的代码中,我们创建了一个名为` read`的对象,然后在文件的开头使用`./`关键字来命名该对象,并在文件中定义了一个名为` json`的变量,并在其中定义了一个名为` json`的字段。比如,我们可以使用 read方法读取 json文件中的内容,然后使用 send方法将其发送到 json文件中。_python怎么读取json文件
文章浏览阅读1.4k次。首字母缩略词 API 代表应用程序编程接口,它是一种设备,例如用于使用编程代码发送和检索数据的服务器。最常见的是,该技术用于从源检索数据并将其显示给软件应用程序及其用户。当您访问网页时,API 的工作方式与浏览器相同,信息请求会发送到服务器,如何在 Windows PC 中手动创建系统还原点服务器会做出响应。唯一的区别是服务器响应的数据类型,对于 API,数据是 JSON 类型。JSON 代表 JavaScript Object Notation,它是大多数软件语言中 API 的标准数据表示法。_api是什么 python
文章浏览阅读802次,点赞10次,收藏10次。解决一个JSON反序列化问题-空字符串变为空集合_cannot coerce empty string ("") to element of `java.util.arraylist
文章浏览阅读882次。Unity Json和Xml的序列化和反序列化_unity json反序列化存储换行
文章浏览阅读796次。reader.readAsText(data.file)中data.file的数据格式为。使用FileReader对象读取文件内容,最后将文件内容进行处理使用。_a-upload 同时支持文件和文件夹
文章浏览阅读775次,点赞19次,收藏10次。fastjson是由国内的阿里推出的一种json处理器,由java语言编写,无依赖,不需要引用额外的jar包,能直接运行在jdk环境中,它的解析速度是非常之快的,目前超过了所有json库。提示:以下是引用fastjson的方法,数据未涉及到私密信息。_解析器用fastjson还是jackson
文章浏览阅读940次。【Qt之JSON文件】QJsonDocument、QJsonObject、QJsonArray等类介绍及使用_使用什么方法检查qjsondocument是否为空
文章浏览阅读957次,点赞34次,收藏22次。主要内容原生 ajax重点重点JSON熟悉章节目标掌握原生 ajax掌握jQuery ajax掌握JSON第一节 ajax1. 什么是ajaxAJAX 全称为,表示异步的Java脚本和Xml文件,是一种异步刷新技术。2. 为什么要使用ajaxServlet进行网页的变更往往是通过请求转发或者是重定向来完成,这样的操作更新的是整个网页,如果我们只需要更新网页的局部内容,就需要使用到AJAX来处理了。因为只是更新局部内容,因此,Servlet。
文章浏览阅读1.4k次,点赞45次,收藏13次。主要介绍了JsonFormat与@DateTimeFormat注解实例解析,文中通过示例代码介绍的非常详细,对大家的学习 或者工作具有一定的参考学习价值,需要的朋友可以参考下 这篇文章主要介绍了从数据库获取时间传到前端进行展示的时候,我们有时候可能无法得到一个满意的时间格式的时间日期,在数据库中显 示的是正确的时间格式,获取出来却变成了时间戳,@JsonFormat注解很好的解决了这个问题,我们通过使用 @JsonFormat可以很好的解决:后台到前台时间格式保持一致的问题,
文章浏览阅读1k次。JsonDeserialize:json反序列化注解,作用于setter()方法,将json数据反序列化为java对象。可以理解为用在处理接收的数据上。_jsondeserialize
文章浏览阅读2.7k次。labelme标注的json文件是在数据标注时产生,不能直接应用于模型训练。各大目标检测训练平台或项目框架均有自己的数据格式要求,通常为voc、coco或yolo格式。由于yolov8项目比较火热,故此本博文详细介绍将json格式标注转化为yolo格式的过程及其代码。_labelme json 转 yolo
文章浏览阅读790次,点赞26次,收藏6次。GROUP_CONCAT_UNORDERED(): 与GROUP_CONCAT类似,但不保证结果的顺序。COUNT_DISTINCT_AND_ORDERED(): 计算指定列的不同值的数量,并保持结果的顺序。COUNT_ALL_DISTINCT(): 计算指定列的所有不同值的数量(包括NULL)。AVG_RANGE(): 计算指定列的最大值和最小值之间的差异的平均值。JSON_OBJECT(): 将结果集中的行转换为JSON对象。COUNT_DISTINCT(): 计算指定列的不同值的数量。_mysql json 聚合
文章浏览阅读1.2k次。ajax同步与异步,json-serve的安装与使用,node.js的下载_json-serve 与node版本
文章浏览阅读1.7k次。`.net core`提供了Json处理模块,在命名空间`System.Text.Json`中,下面通过顶级语句,对C#的Json功能进行讲解。_c# json
文章浏览阅读2.8k次。主要介绍了python对于json文件的读写操作内容_python读取json文件
文章浏览阅读770次。然而,有时候在处理包含中文字符的Json数据时会出现乱码的情况。本文将介绍一种解决Json中文乱码问题的常见方法,并提供相应的源代码和描述。而某些情况下,中文字符可能会被错误地编码或解码,导致乱码的出现。通过适当地控制编码和解码过程,我们可以有效地处理包含中文字符的Json数据,避免乱码的发生。通过控制编码和解码过程,我们可以确保Json数据中的中文字符能够正确地传输和解析。为了解决这个问题,我们可以使用C#的System.Text.Encoding类提供的方法进行编码和解码的控制。_c# json 中文编码
文章浏览阅读997次。【代码】【工具】XML和JSON互相转换。_xml 转json
文章浏览阅读1.1k次。json path 提取数据_jsonpath数组取值
文章浏览阅读3w次,点赞35次,收藏36次。本文主要介绍了pandas read_json时ValueError: Expected object or value的解决方案,希望能对学习python的同学们有所帮助。文章目录1. 问题描述2. 解决方案_valueerror: expected object or value