将json转换为键值对中的文本的java代码

将json转换为键值对中的文本的java代码,java,json,Java,Json,我是Java新手,我想写一段代码,将传入的json文件转换为键值对中的文本,键值对将被管道分隔。json文件中的模式往往会发生变化。因此,我无法基于每个值编写程序(我之前尝试过) 有人能帮忙吗 该文件是: [{"type_id":4102,"id":0,"product_name":"ATP:Endpoint","feature_name":"ATP:Endpoint", "feature_ver":"2014.2.0","atpProtocol":"av","device_uid":"D00A

我是Java新手,我想写一段代码,将传入的json文件转换为键值对中的文本,键值对将被管道分隔。json文件中的模式往往会发生变化。因此,我无法基于每个值编写程序(我之前尝试过)

有人能帮忙吗

该文件是:

[{"type_id":4102,"id":0,"product_name":"ATP:Endpoint","feature_name":"ATP:Endpoint",
"feature_ver":"2014.2.0","atpProtocol":"av","device_uid":"D00A9450ABD85ACD2B0125968FEABBF9","device_ip":"10.75.81.205","device_name":"10.75.81.205","file":{"name":"CSIDL_PROFILE\\desktop\\av ping\\malheur_34_0\\malheur_34_0 - copy (4)","folder":"CSIDL_PROFILE\\desktop\\aving\\malheur_34_0","sha2":"BC44F53958886E6B220CA6C634D78703220139
E968719A7459B859954CAA4A77","md5":null,"version":null,"size":null,"date_created":null,"date_modified":null,"date_accessed":null},"platform":{"processor":"x86 Family 6 Model 45 Stepping 7","country":"1","language":"English","system":"Windows 7 build 7601 Service Pack 1","scanner":"Symantec Endpoint Protection 12.1.3.0"},"scan":{"signatures_version":"20141112.002","technology":"AV Engine"}]

我已经编写了一些将json字符串解析为map/list对象的方法

public static Map<String,Object> parseJSONObjectToMap(JSONObject jsonObject) throws JSONException{
    Map<String, Object> mapData = new HashMap<String, Object>();
    Iterator<String> keysItr = jsonObject.keys();
        while(keysItr.hasNext()) {
            String key = keysItr.next();
            Object value = jsonObject.get(key);

            if(value instanceof JSONArray) {
                value = parseJSONArrayToList((JSONArray) value);
            }else if(value instanceof JSONObject) {
                value = parseJSONObjectToMap((JSONObject) value);
            }
            mapData.put(key, value);
        }
    return mapData;
}

public static List<Object> parseJSONArrayToList(JSONArray array) throws JSONException {
    List<Object> list = new ArrayList<Object>();
    for(int i = 0; i < array.length(); i++) {
        Object value = array.get(i);
        if(value instanceof JSONArray) {
            value = parseJSONArrayToList((JSONArray) value);
        }else if(value instanceof JSONObject) {
            value = parseJSONObjectToMap((JSONObject) value);
        }
        list.add(value);
    }
    return list;
}
publicstaticmap parseJSONObjectToMap(jsonobjectjsonobject)抛出JSONException{
Map mapData=new HashMap();
迭代器keysItr=jsonObject.keys();
while(keysItr.hasNext()){
String key=keysItr.next();
Object value=jsonObject.get(key);
if(JSONArray的值实例){
value=parseJSONArrayToList((JSONArray)值);
}else if(JSONObject的值实例){
value=parseJSONObjectToMap((JSONObject)值);
}
mapData.put(键、值);
}
返回地图数据;
}
公共静态列表parseJSONArrayList(JSONArray数组)抛出JSONException{
列表=新的ArrayList();
对于(int i=0;i
因此,我编写了一些通用代码,用于将每个json文件输入转换为管道。这也将读取子节点和。。。请看一下,测试一下你自己。我认为这将对其他人有用

package test;

import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;
import java.util.Iterator;
import java.util.Map;

import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.*;

public class ParseSEPEvents {

String endTime;
long latestLiveVisitStartTime;
boolean foundLatestVisitEndTime = false;

public ParseSEPEvents() {
}

public static void main(String args[]) throws Exception{
    ParseSEPEvents obj = new ParseSEPEvents();
    String contents = new String(Files.readAllBytes(Paths.get("<FileLocation>")));

    int idx = contents.indexOf("json");
    String jsonStr = contents.substring(idx+5);
    String header = contents.substring(0, idx+5);
    StringBuilder returnStr = obj.logParser(jsonStr);
    StringBuilder fnlStr = new StringBuilder(header).append(returnStr);

    System.out.println(fnlStr);
}

private StringBuilder parseToken( JsonNode node) {
    StringBuilder event = new StringBuilder();

    if (node == null) {
        return event;
    }       

    Iterator<Map.Entry<String, JsonNode>> itr = node.fields();      
    while (itr.hasNext()) {
        Map.Entry<String, JsonNode> keyValue = itr.next();
        String keyStr = keyValue.getKey();
        JsonNode innerNode = node.findValue(keyStr);            

        if(innerNode.isValueNode()){
        event.append(keyValue.getKey()).append("|").append(innerNode.toString()).append("|");
        }else{
            StringBuilder eventChild = parseToken(innerNode);
            event.append(keyValue.getKey()).append("[").append(eventChild).append("]");
        }

    }

    return event;

}

public StringBuilder logParser(String jsonStr) {
    JsonParser parser = null;
    StringBuilder strBuild = new StringBuilder();

    try {
        JsonFactory factory = new MappingJsonFactory();
        System.out.println("Parsing file records.");
        parser = factory.createParser(jsonStr);

        JsonToken currentToken = parser.nextToken();
        if (currentToken != JsonToken.START_ARRAY) {
            System.out.println("Warning: root should be object. quiting.");
            return strBuild;
        }

        while ((parser.nextToken()) != JsonToken.END_ARRAY) {
            currentToken = parser.nextToken();
            JsonNode node = parser.readValueAsTree();

            StringBuilder event = new StringBuilder();
            event = parseToken(node);
            return new StringBuilder("|").append(event);
        }

    } catch (JsonParseException jpe) {
        System.out.println("Unable to parse json records."
                + jpe.getMessage());
    } catch (IOException ioe) {
        System.out.println("Error while parsing file. " + ioe.getMessage());
    } finally {
        try {
            if ((parser != null) && !(parser.isClosed())) {
                parser.close();
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
             }
         }

    return strBuild;
     }

}
封装测试;
导入java.io.File;
导入java.io.IOException;
导入java.nio.charset.StandardCharset;
导入java.nio.file.*;
导入java.util.Iterator;
导入java.util.Map;
导入com.fasterxml.jackson.core.*;
导入com.fasterxml.jackson.databind.*;
公共类事件{
字符串结束时间;
长时间的迟到访问开始时间;
布尔值foundLatestVisitEndTime=false;
公共事件(){
}
公共静态void main(字符串args[])引发异常{
ParseSEPEvents obj=新的ParseSEPEvents();
字符串内容=新字符串(Files.readAllBytes(path.get(“”));
int idx=contents.indexOf(“json”);
字符串jsonStr=contents.substring(idx+5);
字符串头=contents.substring(0,idx+5);
StringBuilder returnStr=obj.logParser(jsonStr);
StringBuilder fnlStr=新的StringBuilder(标头).append(returnStr);
系统输出打印LN(fnlStr);
}
私有StringBuilder parseToken(JsonNode节点){
StringBuilder事件=新建StringBuilder();
if(node==null){
返回事件;
}       
迭代器itr=node.fields();
while(itr.hasNext()){
Map.Entry keyValue=itr.next();
字符串keyStr=keyValue.getKey();
JsonNode innerNode=node.findValue(keyStr);
if(innerNode.isValueNode()){
event.append(keyValue.getKey()).append(“|”).append(innerNode.toString()).append(“|”);
}否则{
StringBuilder eventChild=parseToken(innerNode);
append(keyValue.getKey()).append(“[”).append(eventChild.append(“]);
}
}
返回事件;
}
公共StringBuilder日志解析器(字符串jsonStr){
JsonParser=null;
StringBuilder strBuild=新建StringBuilder();
试一试{
JsonFactory=new-MappingJsonFactory();
System.out.println(“解析文件记录”);
parser=factory.createParser(jsonStr);
JsonToken currentToken=parser.nextToken();
if(currentToken!=JsonToken.START\u数组){
System.out.println(“警告:root应该是object.quiting.”);
返回strBuild;
}
while((parser.nextToken())!=JsonToken.END\u数组){
currentToken=parser.nextToken();
JsonNode=parser.readValueAsTree();
StringBuilder事件=新建StringBuilder();
事件=解析令牌(节点);
返回新的StringBuilder(“|”)。追加(事件);
}
}捕获(JsonParseException jpe){
System.out.println(“无法解析json记录。”
+jpe.getMessage());
}捕获(ioe异常ioe){
System.out.println(“解析文件时出错。”+ioe.getMessage());
}最后{
试一试{
if((parser!=null)&&&!(parser.isClosed()){
parser.close();
}
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
返回strBuild;
}
}

您能显示您的json输入吗?您期望的输出是什么?对于数组、对象等,您将使用什么符号。如果您使用非标准库,您至少应该指出依赖项(即要使用的库)。是的,谢谢提醒您需要导入以下库