精华内容
下载资源
问答
  • 无效的json格式
    2022-02-23 22:25:40

    JSON 方法,toJSON

    假设我们有一个复杂的对象,我们希望将其转换为字符串,以通过网络发送,或者只是为了在日志中输出它。

    JSON.stringify

    JSON(JavaScript Object Notation)是表示值和对象的通用格式。在 RFC 4627 标准中有对其的描述。最初它是为 JavaScript 而创建的,但许多其他编程语言也有用于处理它的库。因此,当客户端使用 JavaScript 而服务器端是使用 Ruby/PHP/Java 等语言编写的时,使用 JSON 可以很容易地进行数据交换。

    JavaScript 提供了如下方法:

    • JSON.stringify 将对象转换为 JSON。
    • JSON.parse 将 JSON 转换回对象。

    例如,在这里我们 JSON.stringify 一个 student 对象:

    let student = {
      name: 'John',
      age: 30,
      isAdmin: false,
      courses: ['html', 'css', 'js'],
      wife: null
    };
    
    let json = JSON.stringify(student);
    
    alert(typeof json); // we've got a string!
    
    alert(json);
    /* JSON 编码的对象:
    {
      "name": "John",
      "age": 30,
      "isAdmin": false,
      "courses": ["html", "css", "js"],
      "wife": null
    }
    */
    

    方法 JSON.stringify(student) 接收对象并将其转换为字符串。

    得到的 json 字符串是一个被称为 JSON 编码(JSON-encoded)序列化(serialized)字符串化(stringified)编组化(marshalled) 的对象。我们现在已经准备好通过有线发送它或将其放入普通数据存储。

    请注意,JSON 编码的对象与对象字面量有几个重要的区别:

    • 字符串使用双引号。JSON 中没有单引号或反引号。所以 'John' 被转换为 "John"
    • 对象属性名称也是双引号的。这是强制性的。所以 age:30 被转换成 "age":30

    JSON.stringify 也可以应用于原始(primitive)数据类型。

    JSON 支持以下数据类型:

    • Objects { ... }
    • Arrays [ ... ]
    • Primitives:
      • strings,
      • numbers,
      • boolean values true/false
      • null

    例如:

    // 数字在 JSON 还是数字
    alert( JSON.stringify(1) ) // 1
    
    // 字符串在 JSON 中还是字符串,只是被双引号扩起来
    alert( JSON.stringify('test') ) // "test"
    
    alert( JSON.stringify(true) ); // true
    
    alert( JSON.stringify([1, 2, 3]) ); // [1,2,3]
    

    JSON 是语言无关的纯数据规范,因此一些特定于 JavaScript 的对象属性会被 JSON.stringify 跳过。

    即:

    • 函数属性(方法)。
    • Symbol 类型的键和值。
    • 存储 undefined 的属性。
    let user = {
      sayHi() { // 被忽略
        alert("Hello");
      },
      [Symbol("id")]: 123, // 被忽略
      something: undefined // 被忽略
    };
    
    alert( JSON.stringify(user) ); // {}(空对象)
    

    通常这很好。如果这不是我们想要的方式,那么我们很快就会看到如何自定义转换方式。

    最棒的是支持嵌套对象转换,并且可以自动对其进行转换。

    例如:

    let meetup = {
      title: "Conference",
      room: {
        number: 23,
        participants: ["john", "ann"]
      }
    };
    
    alert( JSON.stringify(meetup) );
    /* 整个解构都被字符串化了
    {
      "title":"Conference",
      "room":{"number":23,"participants":["john","ann"]},
    }
    */
    

    重要的限制:不得有循环引用。

    例如:

    let room = {
      number: 23
    };
    
    let meetup = {
      title: "Conference",
      participants: ["john", "ann"]
    };
    
    meetup.place = room;       // meetup 引用了 room
    room.occupiedBy = meetup; // room 引用了 meetup
    
    JSON.stringify(meetup); // Error: Converting circular structure to JSON
    

    在这里,转换失败了,因为循环引用:room.occupiedBy 引用了 meetupmeetup.place 引用了 room

    image-20220223222032863

    排除和转换:replacer

    JSON.stringify 的完整语法是:

    let json = JSON.stringify(value[, replacer, space])
    
    • value

      要编码的值。

    • replacer

      要编码的属性数组或映射函数 function(key, value)

    • space

      用于格式化的空格数量

    大部分情况,JSON.stringify 仅与第一个参数一起使用。但是,如果我们需要微调替换过程,比如过滤掉循环引用,我们可以使用 JSON.stringify 的第二个参数。

    如果我们传递一个属性数组给它,那么只有这些属性会被编码。

    例如:

    let room = {
      number: 23
    };
    
    let meetup = {
      title: "Conference",
      participants: [{name: "John"}, {name: "Alice"}],
      place: room // meetup 引用了 room
    };
    
    room.occupiedBy = meetup; // room 引用了 meetup
    
    alert( JSON.stringify(meetup, ['title', 'participants']) );
    // {"title":"Conference","participants":[{},{}]}
    

    这里我们可能过于严格了。属性列表应用于了整个对象结构。所以 participants 是空的,因为 name 不在列表中。

    让我们包含除了会导致循环引用的 room.occupiedBy 之外的所有属性:

    let room = {
      number: 23
    };
    
    let meetup = {
      title: "Conference",
      participants: [{name: "John"}, {name: "Alice"}],
      place: room // meetup 引用了 room
    };
    
    room.occupiedBy = meetup; // room 引用了 meetup
    
    alert( JSON.stringify(meetup, ['title', 'participants', 'place', 'name', 'number']) );
    /*
    {
      "title":"Conference",
      "participants":[{"name":"John"},{"name":"Alice"}],
      "place":{"number":23}
    }
    */
    

    现在,除 occupiedBy 以外的所有内容都被序列化了。但是属性的列表太长了。

    幸运的是,我们可以使用一个函数代替数组作为 replacer

    该函数会为每个 (key,value) 对调用并返回“已替换”的值,该值将替换原有的值。如果值被跳过了,则为 undefined

    在我们的例子中,我们可以为 occupiedBy 以外的所有内容按原样返回 value。为了 occupiedBy,下面的代码返回 undefined

    let room = {
      number: 23
    };
    
    let meetup = {
      title: "Conference",
      participants: [{name: "John"}, {name: "Alice"}],
      place: room // meetup 引用了 room
    };
    
    room.occupiedBy = meetup; // room 引用了 meetup
    
    alert( JSON.stringify(meetup, function replacer(key, value) {
      alert(`${key}: ${value}`);
      return (key == 'occupiedBy') ? undefined : value;
    }));
    
    /* key:value pairs that come to replacer:
    :             [object Object]
    title:        Conference
    participants: [object Object],[object Object]
    0:            [object Object]
    name:         John
    1:            [object Object]
    name:         Alice
    place:        [object Object]
    number:       23
    occupiedBy: [object Object]
    */
    

    请注意 replacer 函数会获取每个键/值对,包括嵌套对象和数组项。它被递归地应用。replacer 中的 this 的值是包含当前属性的对象。

    第一个调用很特别。它是使用特殊的“包装对象”制作的:{"": meetup}。换句话说,第一个 (key, value) 对的键是空的,并且该值是整个目标对象。这就是上面的示例中第一行是 ":[object Object]" 的原因。

    这个理念是为了给 replacer 提供尽可能多的功能:如果有必要,它有机会分析并替换/跳过整个对象。

    格式化:space

    JSON.stringify(value, replacer, spaces) 的第三个参数是用于优化格式的空格数量。

    以前,所有字符串化的对象都没有缩进和额外的空格。如果我们想通过网络发送一个对象,那就没什么问题。space 参数专门用于调整出更美观的输出。

    这里的 space = 2 告诉 JavaScript 在多行中显示嵌套的对象,对象内部缩进 2 个空格:

    let user = {
      name: "John",
      age: 25,
      roles: {
        isAdmin: false,
        isEditor: true
      }
    };
    
    alert(JSON.stringify(user, null, 2));
    /* 两个空格的缩进:
    {
      "name": "John",
      "age": 25,
      "roles": {
        "isAdmin": false,
        "isEditor": true
      }
    }
    */
    
    /* 对于 JSON.stringify(user, null, 4) 的结果会有更多缩进:
    {
        "name": "John",
        "age": 25,
        "roles": {
            "isAdmin": false,
            "isEditor": true
        }
    }
    */
    

    第三个参数也可以是字符串。在这种情况下,字符串用于缩进,而不是空格的数量。

    spaces 参数仅用于日志记录和美化输出。

    自定义 “toJSON”

    toString 进行字符串转换,对象也可以提供 toJSON 方法来进行 JSON 转换。如果可用,JSON.stringify 会自动调用它。

    现在让我们为对象 room 添加一个自定义的 toJSON

    let room = {
      number: 23,
      toJSON() {
        return this.number;
      }
    };
    
    let meetup = {
      title: "Conference",
      room
    };
    
    alert( JSON.stringify(room) ); // 23
    
    alert( JSON.stringify(meetup) );
    /*
      {
        "title":"Conference",
        "room": 23
      }
    */
    

    正如我们所看到的,toJSON 既可以用于直接调用 JSON.stringify(room) 也可以用于当 room 嵌套在另一个编码对象中时。

    JSON.parse

    要解码 JSON 字符串,我们需要另一个方法 JSON.parse

    语法:

    let value = JSON.parse(str, [reviver]);
    
    • str

      要解析的 JSON 字符串。

    • reviver

      可选的函数 function(key,value),该函数将为每个 (key, value) 对调用,并可以对值进行转换。

    例如:

    // 字符串化数组
    let numbers = "[0, 1, 2, 3]";
    
    numbers = JSON.parse(numbers);
    
    alert( numbers[1] ); // 1
    

    对于嵌套对象:

    let userData = '{ "name": "John", "age": 35, "isAdmin": false, "friends": [0,1,2,3] }';
    
    let user = JSON.parse(userData);
    
    alert( user.friends[1] ); // 1
    

    JSON 可能会非常复杂,对象和数组可以包含其他对象和数组。但是它们必须遵循相同的 JSON 格式。

    以下是手写 JSON 时的典型错误(有时我们必须出于调试目的编写它):

    let json = `{
      name: "John",                     // 错误:属性名没有双引号
      "surname": 'Smith',               // 错误:值使用的是单引号(必须使用双引号)
      'isAdmin': false                  // 错误:键使用的是单引号(必须使用双引号)
      "birthday": new Date(2000, 2, 3), // 错误:不允许使用 "new",只能是裸值
      "friends": [0,1,2,3]              // 这个没问题
    }`;
    

    此外,JSON 不支持注释。向 JSON 添加注释无效。

    还有另一种名为 JSON5 的格式,它允许未加引号的键,也允许注释等。但这是一个独立的库,不在语言的规范中。

    常规的 JSON 格式严格,并不是因为它的开发者很懒,而是为了实现简单,可靠且快速地实现解析算法。

    使用 reviver

    想象一下,我们从服务器上获得了一个字符串化的 meetup 对象。

    它看起来像这样:

    // title: (meetup title), date: (meetup date)
    let str = '{"title":"Conference","date":"2017-11-30T12:00:00.000Z"}';
    

    ……现在我们需要对它进行 反序列(deserialize),把它转换回 JavaScript 对象。

    让我们通过调用 JSON.parse 来完成:

    let str = '{"title":"Conference","date":"2017-11-30T12:00:00.000Z"}';
    
    let meetup = JSON.parse(str);
    
    alert( meetup.date.getDate() ); // Error!
    

    啊!报错了!

    meetup.date 的值是一个字符串,而不是 Date 对象。JSON.parse 怎么知道应该将字符串转换为 Date 呢?

    让我们将 reviver 函数传递给 JSON.parse 作为第二个参数,该函数按照“原样”返回所有值,但是 date 会变成 Date

    let str = '{"title":"Conference","date":"2017-11-30T12:00:00.000Z"}';
    
    let meetup = JSON.parse(str, function(key, value) {
      if (key == 'date') return new Date(value);
      return value;
    });
    
    alert( meetup.date.getDate() ); // 现在正常运行了!
    

    顺便说一下,这也适用于嵌套对象:

    let schedule = `{
      "meetups": [
        {"title":"Conference","date":"2017-11-30T12:00:00.000Z"},
        {"title":"Birthday","date":"2017-04-18T12:00:00.000Z"}
      ]
    }`;
    
    schedule = JSON.parse(schedule, function(key, value) {
      if (key == 'date') return new Date(value);
      return value;
    });
    
    alert( schedule.meetups[1].date.getDate() ); // 正常运行了!
    

    总结

    • JSON 是一种数据格式,具有自己的独立标准和大多数编程语言的库。
    • JSON 支持 object,array,string,number,boolean 和 null
    • JavaScript 提供序列化(serialize)成 JSON 的方法 JSON.stringify 和解析 JSON 的方法 JSON.parse
    • 这两种方法都支持用于智能读/写的转换函数。
    • 如果一个对象具有 toJSON,那么它会被 JSON.stringify 调用。
    更多相关内容
  • 今天在linux中使用curl发送一个post请求时,带有json的数据,在发送时发现json中的变量没有解析出来 如下 curl -i -X POST -H 'Content-type':'application/json' -d {BTime:$btime} http://api.baidu.com 变量...
  • 目录自动格式化代码更改页面<title> 安装依赖项导入组件代码分割添加样式表后处理CSS 添加CSS预处理器(Sass,Less等) 添加图像,字体和文件使用public文件夹更改HTML 在模块系统之外添加资产何时使用public...
  • 我们一直想用json进行注释,但是会导致JSON.parse中的json格式无效。 但是,使用remove-json-comments可以做到。 用法 $ npm install remove-json-comments --save var removeJsonComments = require ( 'remove-...
  • echars中包含map模式,各省市的地理位置信息,包含js和json两个版本。
  • 修复无效JSON文档。 试试看: : 可以解决以下问题: 在按键周围添加缺失的引号 添加缺少的转义字符 添加缺少的逗号 用双引号替换单引号 用常规双引号替换特殊的引号字符,例如“...” 用常规空格替换特殊的...
  • editplus格式json文件

    2017-10-09 17:05:25
    edit plus编辑器格式json文件的插件,如何使用插件,见http://blog.csdn.net/lzandwss/article/details/77967289
  • Hive中如何处理JSON格式数据 Hive 处理json数据总体来说有三个办法: 使用内建的函数get_json_object、json_tuple 使用自定义的UDF(一进一出),自定义UDTF(一进多出) 第三方的SerDe–》JSONSerder 1、使用内建函数...

    Hive中如何处理JSON格式数据

    Hive 处理json数据总体来说有三个办法:

    • 使用内建的函数get_json_object、json_tuple
    • 使用自定义的UDF(一进一出),自定义UDTF(一进多出)
    • 第三方的SerDe–》JSONSerder

    1、使用内建函数处理

    get_json_object(string json_string, string path)

    返回值:String

    说明:解析json字符串json_string,返回path指定的内容;如果输入的json字符串无效,那么返回NUll;函数每次只能返回一个数据项;

    json_tuple(jsonStr, k1, k2, …)

    返回值:所有的输入参数、输出参数都是String;

    说明:参数为一组键k1,k2,。。。。。和json字符串,返回值的元组。该方法比get_json_object高效,因此可以在一次调用中输入多个键;

    explode,使用explod将Hive一行中复杂的 array 或 map 结构拆分成多行。

    测试数据:

    user1;18;male;{"id": 1,"ids": [101,102,103],"total_number": 3}
    user2;20;female;{"id": 2,"ids": [201,202,203,204],"total_number": 4}
    user3;23;male;{"id": 3,"ids": [301,302,303,304,305],"total_number": 5}
    user4;17;male;{"id": 4,"ids": [401,402,403,304],"total_number": 5}
    user5;35;female;{"id": 5,"ids": [501,502,503],"total_number": 3}
    

    建表加载数据:

    CREATE TABLE IF NOT EXISTS jsont1(
    username string,
    age int,
    sex string,
    json string
    )
    row format delimited fields terminated by ';';
    
    load data local inpath '/root/data/weibo.json' overwrite into table jsont1;
    

    json的处理:

    -- get 单层值
    select username, age, sex, get_json_object(json, "$.id") id,
    get_json_object(json, "$.ids") ids,
    get_json_object(json, "$.total_number") num
    from jsont1;
    
    -- get 数组
    select username, age, sex, get_json_object(json, "$.id") id,
    get_json_object(json, "$.ids[0]") ids0,
    get_json_object(json, "$.ids[1]") ids1,
    get_json_object(json, "$.ids[2]") ids2,
    get_json_object(json, "$.ids[3]") ids3,
    get_json_object(json, "$.total_number") num
    from jsont1;
    
    -- 使用 json_tuple 一次处理多个字段
    select json_tuple(json, 'id', 'ids', 'total_number')
      from jsont1;
    
    -- 有语法错误
    select username, age, sex, json_tuple(json, 'id', 'ids', 'total_number')
      from jsont1;
    
    -- 使用 explode + lateral view
    -- 在上一步的基础上,再将数据展开
    -- 第一步,将 [101,102,103] 中的 [ ] 替换掉
    -- select "[101,102,103]"
    -- select "101,102,103"
    select regexp_replace("[101,102,103]", "\\[|\\]", "");
    
    -- 第二步,将上一步的字符串变为数组
    select split(regexp_replace("[101,102,103]", "\\[|\\]", ""), ",");
    
    -- 第三步,使用explode + lateral view 将数据展开
    select username, age, sex, id, ids, num
      from jsont1
    lateral view json_tuple(json, 'id', 'ids', 'total_number') t1 as id, ids, num;
    
    with tmp as(
    select username, age, sex, id, ids, num
      from jsont1
    lateral view json_tuple(json, 'id', 'ids', 'total_number') t1 as id, ids, num
    )
    select username, age, sex, id, ids1, num
      from tmp
    lateral view explode(split(regexp_replace(ids, "\\[|\\]", ""), ",")) t1 as ids1;
    

    小结:json_tuple 优点是一次可以解析多个json字段,对嵌套结果的解析操作复杂;

    2、使用UDF处理

    自定义UDF处理json串中的数组。自定义UDF函数:

    • 输入:json串、数组的key

    • 输出:字符串数组

    pom文件

    <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
    
        <dependencies>
           <dependency>
    			<groupId>org.apache.hive</groupId>
    			<artifactId>hive-exec</artifactId>
    			<version>2.3.7</version>
    	</dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.1.23</version>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>2.3.2</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
                <plugin>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <configuration>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                    </configuration>
                    <executions>
                        <execution>
                            <id>make-assembly</id>
                            <phase>package</phase>
                            <goals>
                                <goal>single</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    
    
    package cn.lagou.dw.hive.udf;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONArray;
    import com.alibaba.fastjson.JSONException;
    import com.alibaba.fastjson.JSONObject;
    import com.google.common.base.Strings;
    import org.apache.hadoop.hive.ql.exec.UDF;
    import org.junit.Test;
    
    import java.util.ArrayList;
    
    public class ParseJsonArray extends UDF {
        public ArrayList<String> evaluate(String jsonStr, String arrKey){
            if (Strings.isNullOrEmpty(jsonStr)) {
                return null;
            }
    
            try{
                JSONObject object = JSON.parseObject(jsonStr);
                JSONArray jsonArray = object.getJSONArray(arrKey);
                ArrayList<String> result = new ArrayList<>();
                for (Object o: jsonArray){
                    result.add(o.toString());
                }
    
                return result;
            } catch (JSONException e){
                return null;
            }
        }
    
        @Test
        public void JunitParseJsonArray(){
            String str = "{\"id\": 1,\"ids\": [101,102,103],\"total_number\": 3}";
            String key = "ids";
            ArrayList<String> evaluate = evaluate(str, key);
            System.out.println(JSON.toJSONString(evaluate));
        }
    }
    

    使用自定义 UDF 函数:

    -- 添加开发的jar包(在Hive命令行中)
    add jar /root/edu_jars/my_udf.jar;
    
    -- 创建临时函数。指定类名一定要完整的路径,即包名加类名
    create temporary function lagou_json_array as "com.lagou.edu.ParseJsonArray";
    
    -- 执行查询
    -- 解析json串中的数组
    select username, age, sex, lagou_json_array(json, "ids") ids
      from jsont1;
    
    -- 解析json串中的数组,并展开
    select username, age, sex, ids1
      from jsont1
    lateral view explode(lagou_json_array(json, "ids")) t1 as ids1;
    
    -- 解析json串中的id、num
    select username, age, sex, id, num
      from jsont1
    lateral view json_tuple(json, 'id', 'total_number') t1 as id, num;
    
    -- 解析json串中的数组,并展开
    select username, age, sex, ids1, id, num
      from jsont1
    lateral view explode(lagou_json_array(json, "ids")) t1 as ids1  
    lateral view json_tuple(json, 'id', 'total_number') t1 as id, num;
    

    3、 使用UDTF处理

    UDTF返回结果如下:

    ididstotal_number
    11013
    11023
    11033
    package com.lagou.edu.udtf;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONArray;
    import com.alibaba.fastjson.JSONObject;
    import com.google.common.collect.Lists;
    import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
    import org.apache.hadoop.hive.ql.metadata.HiveException;
    import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
    import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
    import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
    import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
    import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
    
    import java.util.List;
    
    /**
     * 官网编写UDTF地址:https://cwiki.apache.org/confluence/display/Hive/DeveloperGuide+UDTF
     */
    public class ParseJsonArrayUDTF extends GenericUDTF {
        private String[] obj = new String[3];
        /**
         * 输出字段名称及数据类型
         * @param argOIs
         * @return
         * @throws UDFArgumentException
         */
    
        @Override
        public StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException {
            //输出的字段名称列表
            List<String> colName = Lists.newLinkedList();
            colName.add("id");
            colName.add("ids");
            colName.add("total_number");
            //输出的结果数据类型
            List<ObjectInspector> resType = Lists.newLinkedList();
            resType.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
            resType.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
            resType.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
            //返回列名与字段值的数据类型
            return ObjectInspectorFactory.getStandardStructObjectInspector(colName, resType);
        }
    
        @Override
        public void process(Object[] args) throws HiveException {
            //第一个字段
            if (args[0] == null ) {
                return;
            }
            String jsonStr = args[0].toString();
            JSONObject object = JSON.parseObject(jsonStr);
            //获取到id
            String id = object.getString("id");
            String total_number = object.getString("total_number");
            JSONArray ids = object.getJSONArray("ids");
            obj[0]=id;
            obj[2]=total_number;
            for (Object o : ids) {
                obj[1]=o.toString();
                System.out.println(obj[0]+"_"+obj[1]+"_"+obj[2]);
                forward(obj);
            }
    
        }
    
        @Override
        public void close() throws HiveException {
    
        }
    
    
        public static void main(String[] args) throws HiveException {
            ParseJsonArrayUDTF p = new ParseJsonArrayUDTF();
            String str = "{\"id\": 1,\"ids\": [101,102,103],\"total_number\": 3}";
            p.process(new String[]{str});
        }
    }
    
    
    
    hive> add jar /root/jars/myudtf.jar;
      
    hive> create temporary function myudtf as 'com.lagou.edu.udtf.ParseJsonArrayUDTF';
      
    select username, age, sex, t1.id,t1.ids,t1.total_number
    from jsont1
    lateral view myudtf(json) t1 as id,ids,total_number; 
    

    4、使用SerDe处理

    序列化是对象转换为字节序列的过程;反序列化是字节序列恢复为对象的过程;

    对象的序列化主要有两种用途:

    • 对象的持久化,即把对象转换成字节序列后保存到文件中
    • 对象数据的网络传送

    SerDe 是Serializer 和 Deserializer 的简写形式。Hive使用Serde进行行对象的序列与反序列化。最后实现把文件内容映射到 hive 表中的字段数据类型。SerDe包括 Serialize/Deserilize 两个功能:

    • Serialize把Hive使用的java object转换成能写入HDFS字节序列,或者其他系统能识别的流文件
    • Deserilize把字符串或者二进制流转换成Hive能识别的java object对象

    Read : HDFS files => InputFileFormat => <key, value> => Deserializer => Row object

    Write : Row object => Seriallizer => <key, value> => OutputFileFormat => HDFS files

    常见:https://cwiki.apache.org/confluence/display/Hive/DeveloperGuide#DeveloperGuide-HiveSerDe

    Hive本身自带了几个内置的SerDe,还有其他一些第三方的SerDe可供选择。

    create table t11(id string)
    stored as parquet;
    
    create table t12(id string)
    stored as ORC;
    
    desc formatted t11;
    desc formatted t12;
    

    LazySimpleSerDe(默认的SerDe)

    ParquetHiveSerDe

    OrcSerde

    对于纯 json 格式的数据,可以使用 JsonSerDe 来处理。

    {"id": 1,"ids": [101,102,103],"total_number": 3}
    {"id": 2,"ids": [201,202,203,204],"total_number": 4}
    {"id": 3,"ids": [301,302,303,304,305],"total_number": 5}
    {"id": 4,"ids": [401,402,403,304],"total_number": 5}
    {"id": 5,"ids": [501,502,503],"total_number": 3}
    
    create table jsont2(
    id int,
    ids array<string>,
    total_number int
    )
    ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe';
    
    load data local inpath '/root/data/json2.dat' into table jsont2;
    
    select id, ids[0] as ids1,ids[1] as ids2,ids[2] as ids3  ,total_number from jsont2;
    

    各种Json格式处理方法小结:

    1、简单格式的json数据,使用get_json_object、json_tuple处理

    2、对于嵌套数据类型,可以使用UDF,UDTF

    3、纯json串可使用JsonSerDe处理更简单

    请添加图片描述

    请添加图片描述

    展开全文
  • ajax使用json数据格式提交 一开始这么写的 var flobj = { UserId: userid, ForbidSDT: ForbidSDT, ForbidEDT: ForbidEDT } $.ajax({ type: "POST", url: "/Limit/Forbid", contentType: "applicati

    ajax使用json数据格式提交

    一开始这么写的

    var flobj = {
                UserId: userid,
                ForbidSDT: ForbidSDT,
                ForbidEDT: ForbidEDT
            }
            $.ajax({
                type: "POST",
                url: "/Limit/Forbid",
                contentType: "application/json", //必须有  
                dataType: "json", //表示返回值类型,不必须  
                data: { Types: chk_value, fl: flobj, remark: remark, tip: tip },
                success: function (jsonResult) {
                    if (jsonResult.Code == 1)
                    {
                        alert("添加成功");
                        $(target).parent().parent().find("input").attr("disabled", true);
                    } else {
                        alert("添加失败");
                    }
                }
            });
    

    提交的数据格式:

    这种会报错误:

    无效的 JSON 基元: Types

    改为了:

    var flobj = {
                UserId: userid,
                ForbidSDT: ForbidSDT,
                ForbidEDT: ForbidEDT
            }
            $.ajax({
                type: "POST",
                url: "/Limit/Forbid",
                contentType: "application/json", //必须有  
                dataType: "json", //表示返回值类型,不必须  
                data: JSON.stringify({ Types: chk_value, fl: flobj, remark: remark, tip: tip }), 
                success: function (jsonResult) {
                    if (jsonResult.Code == 1)
                    {
                        alert("添加成功");
                        $(target).parent().parent().find("input").attr("disabled", true);
                    } else {
                        alert("添加失败");
                    }
                }
            });
    

    提交的数据格式:

    记录:

    data必须是一个“表示JSON对象的字符串”,而不是一个“JSON”对象

    原因是jquery会把JSON对象序列化成标准POST的形式,ASP.NET WebService需要的是JSON格式的数据,所以必须把你的数据变成一个JSON样子的字符串

    展开全文
  • json localdatetime时间格式无效问题

    千次阅读 2020-06-18 09:03:35
    之前有的javabean ,但是进行某些请求时候需要传json格式的字符串所以需要将其转化为json,发现其中localdatetime转换时候时间中间带有T 导致调用失败 网上查阅都是 @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",...

    之前有的javabean ,但是进行某些请求时候需要传json格式的字符串所以需要将其转化为json,发现其中localdatetime转换时候时间中间带有T 导致调用失败 网上查阅都是

    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8") 

    直接就能搞定 放上去表示无效,后点开标签发现该方法是springboot自带的json方法的   而当前项目是阿里巴巴

    的json  为了区分其标签头部的json  分别是Json和JSON 的区别

    阿里巴巴的

    springboot的

    就觉得之前JSONObject.fromObject都不能用了 偏要用JSON.TOJSON方法。。 百度了有4种json

    Gson

    项目地址:https://github.com/google/gson

    Gson是目前功能最全的Json解析神器,Gson当初是为因应Google公司内部需求而由Google自行研发而来,但自从在2008年五月公开发布第一版后已被许多公司或用户应用。 Gson的应用主要为toJson与fromJson两个转换函数,无依赖,不需要例外额外的jar,能够直接跑在JDK上。 在使用这种对象转换之前,需先创建好对象的类型以及其成员才能成功的将JSON字符串成功转换成相对应的对象。 类里面只要有get和set方法,Gson完全可以实现复杂类型的json到bean或bean到json的转换,是JSON解析的神器。

    FastJson

    项目地址:https://github.com/alibaba/fastjson

    Fastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。无依赖,不需要例外额外的jar,能够直接跑在JDK上。 FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。 FastJson采用独创的算法,将parse的速度提升到极致,超过所有json库。

    Jackson

    项目地址:https://github.com/FasterXML/jackson

    Jackson是当前用的比较广泛的,用来序列化和反序列化json的Java开源框架。Jackson社区相对比较活跃,更新速度也比较快, 从Github中的统计来看,Jackson是最流行的json解析器之一,Spring MVC的默认json解析器便是Jackson。

    Jackson优点很多:

    1. Jackson 所依赖的jar包较少,简单易用。
    2. 与其他 Java 的 json 的框架 Gson 等相比,Jackson 解析大的 json 文件速度比较快。
    3. Jackson 运行时占用内存比较低,性能比较好
    4. Jackson 有灵活的 API,可以很容易进行扩展和定制。

    目前最新版本是2.9.4,Jackson 的核心模块由三部分组成:

    1. jackson-core 核心包,提供基于”流模式”解析的相关 API,它包括 JsonPaser 和 JsonGenerator。Jackson 内部实现正是通过高性能的流模式 API 的 JsonGenerator 和 JsonParser 来生成和解析 json。
    2. jackson-annotations 注解包,提供标准注解功能;
    3. jackson-databind 数据绑定包,提供基于”对象绑定” 解析的相关 API( ObjectMapper )和”树模型” 解析的相关 API(JsonNode);基于”对象绑定” 解析的 API 和”树模型”解析的 API 依赖基于”流模式”解析的 API。

    为什么Jackson的介绍这么长啊?因为它也是本人的最爱。

    Json-lib

    项目地址:http://json-lib.sourceforge.net/index.html

    json-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包,对于复杂类型的转换,json-lib对于json转换成bean还有缺陷, 比如一个类里面会出现另一个类的list或者map集合,json-lib从json到bean的转换就会出现问题。json-lib在功能和性能上面都不能满足现在互联网化的需求。

    这个json介绍来自于https://www.cnblogs.com/javalyy/p/10723634.html 各位看官可以自行去看 特此记录

     

     

    展开全文
  • C++ JSON格式解析

    千次阅读 2022-01-18 11:16:41
    通过C++和JSON解析库写一个简单的Json解析器
  • 因此,我已经将原始的“沉默行为”列表转换为JSON格式,从而可以轻松地构建,过滤结果或创建数据可视化。 示例网络标签 { "label_name": "Yarn Audio", "activity_state": "active", "countries": [ "Germany" ...
  • 无效JSON 基元 解决办法

    千次阅读 2021-04-10 22:14:15
    解决办法1:添加发送数据类型 解决办法2:将发送的json转换为json字符串
  • 无效JSON 基元 两种解决办法

    千次阅读 2020-09-09 23:34:38
    dataType: "json", 移除: contentType: 'application/json', 然后检查参数名称,类型是否符合后台的类型 问题解决 ### 方法二 以上做法,有些情况不可取,payload情况下,提交的data数据要转成json...
  • 请谨慎使用-我已尝试确保它不会使您的JSON无效。 但是,由于必须解析>排序>字符串化,因此有可能会丢失某些内容。 对于纯JSON应该没问题。 安装 通过VSCode扩展安装 用法 选择一个JSON对象(请注意,它使用完整的行...
  • 确认安装 Pretty Json 1. 启用插件安装 通过快捷键 ctrl+shift+p 启用。 2. 查找安装插件 如果找不到,即历史已安装。 恢复 ctrl+alt+j 格式化效果 进入插件配置页 如果是 default/user,配置 default 即可。 ...
  • JSON字符串: var str1 = ‘{ “name”: “cxh”, “sex”: “man” }’; JSON对象: var str2 = { “name”: “cxh”, “sex”: “man” }; 一、JSON字符串转换为JSON对象 要使用上面的str1,必须使用下面的方法先...
  • <p><img alt="" height="777" src=...
  • JSON格式的数据的大小写问题

    千次阅读 2021-12-16 10:03:00
    转自其他网上,出现了以下情况,导致json格式不能识别,@jsonproperty的注解使用无效 json内容{“Name”:“bill”,“Age”,“25”}, 有Person类 public class Person{ private String Name; private String Age; //...
  • 直接看以下安装前和安装后显示效果对比,可见安装后,之前乱糟糟的内容都以 Json 格式展示了,美观多了。 安装前: 安装后: 二、安装步骤 1.下载 下载地址:https://github.com/gildas-lormeau/JSONVue 2.解压 ...
  • Pretty Json 插件,用于JSON格式化,默认快捷键:Ctrl + Alt + J 1. 安装 Pretty Json 插件 a. 打开命令面板,快捷键:Ctrl + Shift + P b. 输入 install c. 等待一会、下面停止了会弹出插件搜索框 d. 选中以下...
  • url地址栏传json格式数据参数

    千次阅读 2020-11-12 22:45:54
    在url地址栏中传输json数据时需要进行转码,因为在程序... 等字符时会认为这是无效的url 例:JSONObject json = new JSONObject();//new一个json对象             Ma...
  • notepad++ 安装JSON格式化插件

    千次阅读 2021-12-16 14:41:45
    但是网上太多同质文章,互相转载且测试无效,经过探索终于找到一个靠谱的安装方式。 一定要在plugins文件夹下创建一个同名文件夹,此步骤极为关键!!!! 1、查看notepad++ 软件版本位数 2、下载对应版本的...
  • 1)文件夹目录下有json格式数据和jpg数据,读取json数据时会报错 解决方法:增加json文件后缀判断 for json_name in json_names: if json_name[-4:]=='json': 2)pandas数据用append增加行无效 解决方法:需要...
  • 用ApiPost发送JSON格式的POST请求示例

    千次阅读 2020-06-03 12:45:56
    ApiPost是一个很好的http模拟器,在测试rest...相对来说,比老外的postman好用多了。 ... 选择“POST”方式, 点击"body",并选择请求方式为application/json 添加: { "userid": 1 } 点击send发送即可。 ...
  • 展开全部jQuery中使用jQuery.parseJSON()方法将字e69da5e6ba903231313335323631343130323136353331333337396230符串转为json格式例如:jQuery.parseJSON('{"test":1}');注意:传入格式有误的 JSON 字符串可能导致抛...
  • 昨天在进行登陆测试返回数据格式时,前端显示的日期都是以标准时间格式显示的,因为后端数据库定义的datetime类型,实体定义的date类型,以json格式返回给前端后,日期都格式化为标准类型。一看这个问题,就想到@...
  • python3 json.dumps之后json格式错误问题

    千次阅读 2020-05-25 16:45:09
    json对象在json.dumps之后,并不是我想要的json数据,如下图第2行数据 原因如下,json.dumps操作一个python对象才能得到json类型对象 如果是str类型对象,就遇到我上面的问题 function description ...
  • BUG日记 ——form提交post请求无法兼容json格式的参数 最近两天一直被一个bug拖慢开发进度,具体情况是关于form表单提交时的的传参格式问题 具体的需求是通过form表单提交相应的参数条件,然后后端以表单的参数为...
  • json格式输出时字符串转义的问题

    千次阅读 2020-08-03 18:38:21
    json格式输出一个属性值如果是字符串,会把一个字符串放到双引号""里,这里有个陷阱就是,如果这个字符串里含有转移字符: 比如双引号\",比如\r,比如\n,比如\\等等,就需要再转义一次,这样输出的json显示才是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 78,345
精华内容 31,338
关键字:

无效的json格式