Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson-映射的递归解析<;字符串,对象>;_Java_Json_Parsing_Jackson - Fatal编程技术网

Java Jackson-映射的递归解析<;字符串,对象>;

Java Jackson-映射的递归解析<;字符串,对象>;,java,json,parsing,jackson,Java,Json,Parsing,Jackson,我试图简化我的代码:我想存储键和值(所有字符串) 实际上,我正在使用地图来存储它。帽道对象可以是值(字符串)或新节点(映射) 如何简化此代码? 递归函数会很好 try { JsonParser jsonParser = new JsonFactory().createJsonParser(content); jsonParser.nextToken(); while (jsonParser.nextToken() != JsonToken.END_OBJECT) {

我试图简化我的代码:我想存储键和值(所有字符串)

实际上,我正在使用
地图
来存储它。帽道
对象
可以是值(
字符串
)或新节点(
映射

如何简化此代码? 递归函数会很好

try {
    JsonParser jsonParser = new JsonFactory().createJsonParser(content);

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

        if (jsonParser.getCurrentToken() == JsonToken.START_OBJECT) {
            while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
                String key = jsonParser.getCurrentName();
                jsonParser.nextToken();

                if (jsonParser.getCurrentToken() == JsonToken.START_OBJECT) {
                    mData.put(key, new HashMap<String, Object>());
                    while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
                        String subkey = jsonParser.getCurrentName();
                        jsonParser.nextToken();

                        if (jsonParser.getCurrentToken() == JsonToken.START_OBJECT) {
                            Map<String, Object> subdata = (Map<String, Object>) mData.get(key);
                            subdata.put(subkey, new HashMap<String, Object>());
                            while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
                                String subsubkey = jsonParser.getCurrentName();
                                jsonParser.nextToken();
                                Map<String, Object> subsubdata = (Map<String, Object>) subdata.get(subkey);
                                LogHelper.d("data[" + key + "][" + subkey + "][" + subsubkey + "]=" + jsonParser.getText());
                                subsubdata.put(subsubkey, jsonParser.getText());
                            }
                        }
                        else {
                            LogHelper.d("data[" + key + "]=" + jsonParser.getText());
                            mData.put(key, jsonParser.getText());
                        }
                    }
                }
                else {
                    LogHelper.d("data[" + key + "]=" + jsonParser.getText());
                    mData.put(key, jsonParser.getText());
                }
            }
        }
        else {
            LogHelper.d("status=" + jsonParser.getText());
            mStatus = jsonParser.getText();
        }
    }
}
catch (IllegalArgumentException e) {
    error("0", "IllegalArgumentException: " + e.getMessage());
}
catch (JsonParseException e) {
    error("0", "IOException: " + e.getMessage());
}
catch (IOException e) {
    error("0", "IOException: " + e.getMessage());
}
试试看{
JsonParser JsonParser=新建JsonFactory().createJsonParser(内容);
jsonParser.nextToken();
while(jsonParser.nextToken()!=JsonToken.END\u对象){
jsonParser.nextToken();
if(jsonParser.getCurrentToken()==JsonToken.START\u对象){
while(jsonParser.nextToken()!=JsonToken.END\u对象){
String key=jsonParser.getCurrentName();
jsonParser.nextToken();
if(jsonParser.getCurrentToken()==JsonToken.START\u对象){
put(key,newhashmap());
while(jsonParser.nextToken()!=JsonToken.END\u对象){
String subkey=jsonParser.getCurrentName();
jsonParser.nextToken();
if(jsonParser.getCurrentToken()==JsonToken.START\u对象){
Map subdata=(Map)mData.get(key);
put(subkey,newhashmap());
while(jsonParser.nextToken()!=JsonToken.END\u对象){
String subkey=jsonParser.getCurrentName();
jsonParser.nextToken();
Map subsubdata=(Map)subdata.get(subkey);
LogHelper.d(“数据[”+key+“][”+subkey+“][”+subsubkey+“]=”+jsonParser.getText());
put(subsubkey,jsonParser.getText());
}
}
否则{
LogHelper.d(“数据[”+key+“]=”+jsonParser.getText());
put(key,jsonParser.getText());
}
}
}
否则{
LogHelper.d(“数据[”+key+“]=”+jsonParser.getText());
put(key,jsonParser.getText());
}
}
}
否则{
LogHelper.d(“status=“+jsonParser.getText());
mStatus=jsonParser.getText();
}
}
}
捕获(IllegalArgumentException e){
错误(“0”,“IllegalArgumentException:+e.getMessage());
}
捕获(JSONParsee异常){
错误(“0”,“IOException:+e.getMessage());
}
捕获(IOE异常){
错误(“0”,“IOException:+e.getMessage());
}

假设您的最终目标只是将JSON反序列化为
映射,那么使用Jackson有一种简单得多的方法来实现这一点。使用对象映射器

final String json = "{}";
final ObjectMapper mapper = new ObjectMapper();
final MapType type = mapper.getTypeFactory().constructMapType(
    Map.class, String.class, Object.class);
final Map<String, Object> data = mapper.readValue(json, type);
final String json=“{}”;
最终ObjectMapper映射器=新ObjectMapper();
final MapType type=mapper.getTypeFactory().constructMapType(
Map.class、String.class、Object.class);
最终映射数据=mapper.readValue(json,类型);

您将需要错误处理等,但这是一个很好的起点。

事实上,使用
jackson-core
jackson-mapper
库,您的代码只需3行即可工作!谢谢