edqdpe6u1#
You can use below class as a workaround if it's very urgent. Pay attention to the first five lines of code of the private static method which does the trick to add null values to paths
paths
private static void paths(Map<Object, String> values, Map<String, Object> paths, String parent, Object javaObject, SerializeConfig config) { if (javaObject == null) { paths.put(parent, javaObject); return; }
/** * Alipay.com Inc. Copyright (c) 2004-2021 All Rights Reserved. */ package com.alibaba.fastjson.extended; import java.lang.reflect.Array; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.IdentityHashMap; import java.util.Map; import java.util.UUID; import com.alibaba.fastjson.JSONException; import com.alibaba.fastjson.JSONPath; import com.alibaba.fastjson.parser.ParserConfig; import com.alibaba.fastjson.serializer.JavaBeanSerializer; import com.alibaba.fastjson.serializer.ObjectSerializer; import com.alibaba.fastjson.serializer.SerializeConfig; /** * @author jingfei.hjf * @version $Id: AdvancedJSONPath.java, v 0.1 2021-03-03 6:07 PM jingfei.hjf Exp $$ */ public class AdvancedJSONPath extends JSONPath { public AdvancedJSONPath(String path) { super(path); } public AdvancedJSONPath(String path, SerializeConfig serializeConfig, ParserConfig parserConfig) { super(path, serializeConfig, parserConfig); } public static Map<String, Object> paths(Object javaObject) { return paths(javaObject, SerializeConfig.globalInstance); } public static Map<String, Object> paths(Object javaObject, SerializeConfig config) { Map<Object, String> values = new IdentityHashMap<Object, String>(); Map<String, Object> paths = new HashMap<String, Object>(); paths(values, paths, "/", javaObject, config); return paths; } private static void paths(Map<Object, String> values, Map<String, Object> paths, String parent, Object javaObject, SerializeConfig config) { if (javaObject == null) { paths.put(parent, javaObject); return; } String p = values.put(javaObject, parent); if (p != null) { Class<?> type = javaObject.getClass(); boolean basicType = type == String.class || type == Boolean.class || type == Character.class || type == UUID.class || type.isEnum() || javaObject instanceof Number || javaObject instanceof Date ; if (!basicType) { return; } } paths.put(parent, javaObject); if (javaObject instanceof Map) { Map map = (Map) javaObject; for (Object entryObj : map.entrySet()) { Map.Entry entry = (Map.Entry) entryObj; Object key = entry.getKey(); if (key instanceof String) { String path = parent.equals("/") ? "/" + key : parent + "/" + key; paths(values, paths, path, entry.getValue(), config); } } return; } if (javaObject instanceof Collection) { Collection collection = (Collection) javaObject; int i = 0; for (Object item : collection) { String path = parent.equals("/") ? "/" + i : parent + "/" + i; paths(values, paths, path, item, config); ++i; } return; } Class<?> clazz = javaObject.getClass(); if (clazz.isArray()) { int len = Array.getLength(javaObject); for (int i = 0; i < len; ++i) { Object item = Array.get(javaObject, i); String path = parent.equals("/") ? "/" + i : parent + "/" + i; paths(values, paths, path, item, config); } return; } if (ParserConfig.isPrimitive2(clazz) || clazz.isEnum()) { return; } ObjectSerializer serializer = config.getObjectWriter(clazz); if (serializer instanceof JavaBeanSerializer) { JavaBeanSerializer javaBeanSerializer = (JavaBeanSerializer) serializer; try { Map<String, Object> fieldValues = javaBeanSerializer.getFieldValuesMap(javaObject); for (Map.Entry<String, Object> entry : fieldValues.entrySet()) { String key = entry.getKey(); if (key instanceof String) { String path = parent.equals("/") ? "/" + key : parent + "/" + key; paths(values, paths, path, entry.getValue(), config); } } } catch (Exception e) { throw new JSONException("toJSON error", e); } return; } return; } }
1条答案
按热度按时间edqdpe6u1#
You can use below class as a workaround if it's very urgent. Pay attention to the first five lines of code of the private static method which does the trick to add null values to
paths