`
san_yun
  • 浏览: 2662762 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

一个递归parse json的方法

    博客分类:
  • code
 
阅读更多

json主要有两种形式,分别是object和array,采用递归解析json字符串。

 

import org.codehaus.jackson.JsonParser;


public interface ValueParser {

    public ValueBean parse(JsonParser jsonParser);
}
 
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.JsonToken;

public class BaseValueParser implements ValueParser {

    public BaseValueParser(){
        super();
    }

    protected Map parseObject(JsonParser jsonParser) throws JsonParseException, IOException {
        JsonToken jsonToken = jsonParser.getCurrentToken();
        if (jsonToken == null) {
            jsonToken = jsonParser.nextToken();
        }
        Map<String, Object> object = new HashMap<String, Object>();

        while ((jsonToken = jsonParser.nextToken()) != JsonToken.END_OBJECT) {

            String key = jsonParser.getText();
            JsonToken nextToken = jsonParser.nextToken();

            if (isSimpleValue(nextToken)) {
                String value = jsonParser.getText();
                object.put(key, value);
            } else {
                ValueBean vb = parse(jsonParser);
                Object value = vb.isObject() ? vb.getObject() : vb.getArray();
                object.put(key, value);
            }
        }
        return object;
    }

    protected List<Object> parseArray(JsonParser jsonParser) throws JsonParseException, IOException {
        JsonToken jsonToken = jsonParser.getCurrentToken();
        if (jsonToken == null) {
            jsonToken = jsonParser.nextToken();
        }

        List<Object> list = new ArrayList<Object>();
        while ((jsonToken = jsonParser.nextToken()) != JsonToken.END_ARRAY) {
            if (isSimpleValue(jsonToken)) {
                String value = jsonParser.getText();
                list.add(value);
            } else {
                ValueBean vb = parse(jsonParser);
                Object value = vb.isObject() ? vb.getObject() : vb.getArray();
                list.add(value);

            }
        }
        return list;
    }

    protected boolean isSimpleValue(JsonToken jsonToken) {
        return !jsonToken.equals(JsonToken.START_ARRAY) && !jsonToken.equals(JsonToken.START_OBJECT);
    }
    
    public ValueBean parse(JsonParser jsonParser) {
        ValueBean vb = new ValueBean();
        try {
            JsonToken jsonToken = jsonParser.getCurrentToken();
            if (jsonToken == null) {
                jsonToken = jsonParser.nextToken();
            }
            if (JsonToken.START_OBJECT.equals(jsonToken)) {
                vb.setObject(parseObject(jsonParser));
                return vb;
            } else if (JsonToken.START_ARRAY.equals(jsonToken)) {
                vb.setArray(parseArray(jsonParser));
                return vb;
            } else {
                throw new RuntimeException("parser json error,jsonParser is" + jsonParser);
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

 

单元测试

import org.codehaus.jackson.JsonParser;
import com.duitang.dboss.resolve.BaseDataResolverFactory;
import com.duitang.dboss.resolve.DataResolverFactory;

public class ValueParseTester {

    public static void main(String[] args) {

        ValueParser parser = new BaseValueParser();
        DataResolverFactory dataResolverFactory = new BaseDataResolverFactory();
        JsonParser jsonParser = dataResolverFactory.getJsonParser("{'tagSet': ['a', 'b'], 'page': '1'}");
        ValueBean result = parser.parse(jsonParser);
        System.out.println(result.getObject());
        jsonParser = dataResolverFactory.getJsonParser("{'tagSet': [1, 2], 'page': '1'}");
        result = parser.parse(jsonParser);
        System.out.println(result.getObject());
        jsonParser = dataResolverFactory.getJsonParser("{'tagSet': [1.12, 2.34], 'page': '1'}");
        result = parser.parse(jsonParser);
        System.out.println(result.getObject());
        jsonParser = dataResolverFactory.getJsonParser("{'tagSet': [{'id':1,'name':2}], 'page': '1'}");
        result = parser.parse(jsonParser);
        System.out.println(result.getObject());
    }
}
 

 

 

分享到:
评论

相关推荐

    Python-从零开始Python实现一个递归下降JSON解释器和生成器

    例如,我们可以设计一个`parse()`函数,它接受一个字符串作为输入,然后递归地解析JSON数据。遇到左大括号时,调用`parse_object()`;遇到左方括号,调用`parse_array()`;遇到引号,调用`parse_string()`等。 ```...

    json字符串递归解析

    以下是一个简单的递归解析JSON字符串的例子: ```javascript function recursiveParse(jsonStr) { try { let jsonObj = JSON.parse(jsonStr); if (typeof jsonObj === 'object' && !Array.isArray(jsonObj)) { ...

    php递归json的类

    此方法接收一个JSON字符串作为参数,然后调用递归方法处理。 “解析索引数组”意味着类可能还包括对索引数组(即下标为连续整数的数组)的处理。在PHP中,数组可以通过`is_array`和`array_keys`结合使用`count`函数...

    json-parse.rar

    - **JSON.parse()函数**:JavaScript原生提供了JSON.parse()方法,用于将一个JSON字符串转化为JavaScript对象。但在本文件中,可能还包含了自定义的逻辑,比如错误处理、格式化输出或自定义的解析规则。 - **格式...

    json-c 一个用于c语言的json解析库,很强大

    `json-c`就是这样一个专门用于C语言的JSON解析库,它提供了对JSON数据的读取、创建、修改和序列化等功能,使得C程序员可以方便地与JSON格式进行交互。 `json-c`库的核心特性包括: 1. **解析和生成JSON**:`json-c...

    deep-parse-json:递归解析字符串化json的Javascript函数

    深度解析-json 递归解析字符串化的 json 并返回 javascript 对象用法 npm install --save deep-parse-json or yarn add deep-parse-json const { deepParseJson } = require('deep-parse-json') const stringified =...

    json2 json

    它还增加了atoJSONString方法和parseJSON方法到Object.prototype。使用thisfile recommended.json_parse.js:该文件包含替代JSON的parse函数thatuses递归下降而不是eval.json_parse_state.js:此文件包含替代JSON的...

    JsonParse解析

    JSONParse是处理JSON数据的一个关键过程,尤其在Java编程语言中,我们需要使用特定的方法来解析JSON字符串或文件,将其转换为可操作的对象。 在Java中,有多种库可以用来进行JSON解析,例如Google的Gson库、Jackson...

    一种简单的json解析方法

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于JavaScript的一个子集,易于人阅读和编写,同时也易于机器解析和生成。在本文中,我们将探讨一种简单的JSON解析方法,通过自定义的JavaScript...

    在J2ME环境下把JSON解析为Hashtable

    当遇到一个JSON对象时,`parseValue()`方法会递归调用`parseJSON()`,将JSON对象转换为另一个Hashtable。遇到JSON数组时,`parseArray()`会被调用,将数组元素逐个解析并添加到Vector中。 例如,给定以下JSON字符串...

    json手动转map和list1

    6. **parseJSON2List()方法**: 这个方法接收一个JSON字符串,将其解析为`JSONArray`,然后遍历数组中的每个`JSONObject`,调用`parseJSON2Map()`方法将每个对象转换为Map,并添加到列表中。 7. **parseJSON2Map()...

    JSON 解析 示例代码

    例如,当尝试解析的字符串不是有效的JSON格式时,`JSON.parse()`会抛出一个错误。我们需要捕获这个错误,并根据具体需求进行处理。 总的来说,理解和掌握JSON解析是现代Web开发的基本技能之一。无论你是前端开发者...

    Sql Server解析Json

    下面将详细介绍 `dbo.parseJSON` 函数的具体实现,该函数的主要目的是将 JSON 字符串解析成一个表格结构,以便于进一步处理。 ##### 1. 函数定义 ```sql CREATE FUNCTION [dbo].[parseJSON](@JSON NVARCHAR(MAX)) ...

    前端展示json数据,格式化,可折叠展开

    例如,一个简单的JSON查看器可以使用递归函数来处理嵌套的对象和数组,创建树状结构。当用户点击某个键时,对应的值(如果是对象或数组)会折叠或展开。以下是一个基本的实现思路: 1. 接收JSON字符串,用`JSON....

    python自动格式化json文件的方法

    - `prepare`:这个方法尝试将读取的原始JSON字符串解析为Python对象。如果失败,则会引发异常。 - `line_intend`:用于生成指定缩进级别的字符串。 - `parse_dict`:用于格式化字典类型的JSON数据,它递归地处理字典...

    json的结构与遍历方法实例分析.docx

    以下是一个简单的 JSON 结构实例: ```json var jsongood = { "parentId": "null", "productId": 1, "name": "商品", "amount": "null", "goods": [ { "parentId": "null", "productId": 11, "name": ...

    C#将json格式转换成DataTable实例

    这个方法假设JSON数据是一个数组,每个元素是一个对象,对象的属性名对应于DataTable的列名,属性值作为数据。如果JSON数据结构复杂,可能需要进行额外的处理。 在实际项目中,根据业务需求,你可以将这个方法封装...

    json复杂数据解析demo

    2. **加载JSON字符串**:获取到JSON数据后,第一步通常是将其转换为一个可操作的对象。在Python中,这可以通过`json.loads()`函数实现,将JSON字符串转化为Python字典或列表。在Java和JavaScript中,对应的函数分别...

    Json解析Demo

    `JSON.parse()`方法接收一个JSON字符串作为参数,并将其转化为JavaScript对象。例如: ```javascript var jsonString = '{"name":"John","age":30,"city":"New York"}'; var jsonObject = JSON.parse(json...

Global site tag (gtag.js) - Google Analytics