Подтвердить что ты не робот

Свойства java для json

Есть ли простой способ преобразования свойств с точечной нотацией в json

то есть

server.host=foo.bar
server.port=1234

К

{
 "server": {
    "host": "foo.bar",
    "port": 1234
  }
} 
4b9b3361

Ответ 1

Не простой способ, но мне удалось это сделать с помощью библиотеки Gson. Результат будет в jsonBundle Строка. Здесь мы получаем свойства или расслоения в этом случае:

final ResourceBundle bundle = ResourceBundle.getBundle("messages");
final Map<String, String> bundleMap = resourceBundleToMap(bundle);

final Type mapType = new TypeToken<Map<String, String>>(){}.getType();

final String jsonBundle = new GsonBuilder()
        .registerTypeAdapter(mapType, new BundleMapSerializer())
        .create()
        .toJson(bundleMap, mapType);

Для этой реализации ResourceBundle необходимо преобразовать в Map, содержащий String в качестве ключа, и String в качестве значения.

private static Map<String, String> resourceBundleToMap(final ResourceBundle bundle) {
    final Map<String, String> bundleMap = new HashMap<>();

    for (String key: bundle.keySet()) {
        final String value = bundle.getString(key);

        bundleMap.put(key, value);
    }

    return bundleMap;
}

Мне пришлось создать пользовательский JSONSerializer с помощью Gson для Map<String, String>:

public class BundleMapSerializer implements JsonSerializer<Map<String, String>> {

    private static final Logger LOGGER = LoggerFactory.getLogger(BundleMapSerializer.class);

    @Override
    public JsonElement serialize(final Map<String, String> bundleMap, final Type typeOfSrc, final JsonSerializationContext context) {
        final JsonObject resultJson =  new JsonObject();

        for (final String key: bundleMap.keySet()) {
            try {
                createFromBundleKey(resultJson, key, bundleMap.get(key));
            } catch (final IOException e) {
                LOGGER.error("Bundle map serialization exception: ", e);
            }
        }

        return resultJson;
    }
}

И вот основная логика создания JSON:

public static JsonObject createFromBundleKey(final JsonObject resultJson, final String key, final String value) throws IOException {
    if (!key.contains(".")) {
        resultJson.addProperty(key, value);

        return resultJson;
    }

    final String currentKey = firstKey(key);
    if (currentKey != null) {
        final String subRightKey = key.substring(currentKey.length() + 1, key.length());
        final JsonObject childJson = getJsonIfExists(resultJson, currentKey);

        resultJson.add(currentKey, createFromBundleKey(childJson, subRightKey, value));
    }

    return resultJson;
}

    private static String firstKey(final String fullKey) {
        final String[] splittedKey = fullKey.split("\\.");

        return (splittedKey.length != 0) ? splittedKey[0] : fullKey;
    }

    private static JsonObject getJsonIfExists(final JsonObject parent, final String key) {
        if (parent == null) {
            LOGGER.warn("Parent json parameter is null!");
            return null;
        }

        if (parent.get(key) != null && !(parent.get(key) instanceof JsonObject)) {
            throw new IllegalArgumentException("Invalid key \'" + key + "\' for parent: " + parent + "\nKey can not be JSON object and property or array in one time");
        }

        if (parent.getAsJsonObject(key) != null) {
            return parent.getAsJsonObject(key);
        } else {
            return new JsonObject();
        }
   }

В конце концов, если бы существовал ключ person.name.firstname со значением John, он будет преобразован в такой JSON:

{
     "person" : {
         "name" : {
             "firstname" : "John"
         }
     }
}

Надеюсь, это поможет:)

Ответ 2

Использование Java-библиотеки конфигурации lightbend (https://github.com/lightbend/config)

String toHierarchicalJsonString(Properties props) {
  com.typesafe.config.Config config = com.typesafe.config.ConfigFactory.parseProperties(props);
  return config.root().render(com.typesafe.config.ConfigRenderOptions.concise());
}

Ответ 3

Это довольно просто, загрузите и добавьте в свою библиотеку: https://code.google.com/p/google-gson/

Gson gsonObj = new Gson();
String strJson =  gsonObj.toJson(yourObject);

Ответ 4

Посмотрите на https://github.com/nzakas/props2js. Вы можете использовать его вручную или fork и использовать в своем проекте.

Ответ 5

Немного рекурсия и Gson:)

public void run() throws IOException {

    Properties properties = ...;

    Map<String, Object> map = new TreeMap<>();

    for (Object key : properties.keySet()) {
        List<String> keyList = Arrays.asList(((String) key).split("\\."));
        Map<String, Object> valueMap = createTree(keyList, map);
        String value = properties.getProperty((String) key);
        value = StringEscapeUtils.unescapeHtml(value);
        valueMap.put(keyList.get(keyList.size() - 1), value);
    }

    Gson gson = new GsonBuilder().setPrettyPrinting().create();
    String json = gson.toJson(map);

    System.out.println("Ready, converts " + properties.size() + " entries.");
}

@SuppressWarnings("unchecked")
private Map<String, Object> createTree(List<String> keys, Map<String, Object> map) {
    Map<String, Object> valueMap = (Map<String, Object>) map.get(keys.get(0));
    if (valueMap == null) {
        valueMap = new HashMap<String, Object>();
    }
    map.put(keys.get(0), valueMap);
    Map<String, Object> out = valueMap;
    if (keys.size() > 2) {
        out = createTree(keys.subList(1, keys.size()), valueMap);
    }
    return out;
}

Ответ 6

Вы можете попробовать с https://github.com/mikolajmitura/java-properties-to-json

Вы можете сгенерировать Json из:

  • из свойств Java (java.util.Properties)
  • из карты (импорт java.util.Map) → Карта & lt; String, String & gt;
  • из карты (импорт java.util.Map) → карта & lt; строка, объект & gt;
  • из InputStream со свойствами (java.io.InputStream)
  • из заданной локализации файла со свойствами
  • из файла со свойствами (java.io.File)


Пример кода:

import pl.jalokim.propertiestojson.util.PropertiesToJsonConverter;

...

Properties properties = ....;
String jsonFromProperties = new PropertiesToJsonConverter().convertToJson(properties);

InputStream inputStream = ....;
String jsonFromInputStream = new PropertiesToJsonConverter().convertToJson(inputStream);

Map<String,String> mapProperties = ....;
String jsonFromInputProperties = new PropertiesToJsonConverter().convertToJson(mapProperties);

Map<String, Object> valuesAsObjectMap = ....;
String jsonFromProperties2 = new PropertiesToJsonConverter().convertFromValuesAsObjectMap(valuesAsObjectMap);

String jsonFromFilePath = new PropertiesToJsonConverter().convertPropertiesFromFileToJson("/home/user/file.properties");

String jsonFromFile = new PropertiesToJsonConverter().convertPropertiesFromFileToJson(new File("/home/user/file.properties"));

maven зависимость:

      <dependency>
          <groupId>pl.jalokim.propertiestojson</groupId>
          <artifactId>java-properties-to-json</artifactId>
          <version>5.1.0</version>
      </dependency>

зависимость требуется минимум java 8.

еще пример использования на https://github.com/mikolajmitura/java-properties-to-json

Ответ 7

Мне не нужна зависимость от gson, и я хотел вернуть иерархический json из контроллера Spring, поэтому для меня было достаточно глубокой карты.

Это работает для меня, просто переверните все ваши ключи и перейдите на пустую карту.

void recurseCreateMaps(Map<String, Object> currentMap, String key, String value) {
    if (key.contains(".")) {
        String currentKey = key.split("\\.")[0];

        Map<String, Object> deeperMap;

        if (currentMap.get(currentKey) instanceof Map) {
            deeperMap = (Map<String, Object>) currentMap.get(currentKey);
        } else {
            deeperMap = new HashMap<>();
            currentMap.put(currentKey, deeperMap);
        }

        recurseCreateMaps(deeperMap, key.substring(key.indexOf('.') + 1), value);
    } else {
        currentMap.put(key, value);
    }
}

Ответ 8

просто используйте конструктор org.json.JSONObject, который получает карту (свойства которой расширяются):

JSONObject jsonProps = new JSONObject(properties);
jsonProps.toString();

Если у вас еще нет загруженных свойств, вы можете сделать это из файла

Properties properties= new Properties();
File file = new File("/path/to/test.properties");
FileInputStream fileInput = new FileInputStream(file);
properties.load(fileInput);

Если вы хотите сделать обратное и прочитать строку json в файл prop, вы можете использовать com.fasterxml.jackson.databind.ObjectMapper:

HashMap<String,String> result = new ObjectMapper().readValue(jsonPropString, HashMap.class);
Properties props = new Properties();
props.putAll(result);

Ответ 9

Попробуйте прочитать http://www.oracle.com/technetwork/articles/java/json-1973242.html, вы найдете несколько классов для работы с json.

Я предполагаю, что извлечение json из локального файла, внутреннего ресурса в банке или в другое место, определяемое URL-адресом, и просто чтение его с помощью JsonReader, получают задание.


Это отключено от исходного сайта, опубликованного ранее.

 URL url = new URL("https://graph.facebook.com/search?q=java&type=post");
 try (InputStream is = url.openStream();
      JsonReader rdr = Json.createReader(is)) {

      JsonObject obj = rdr.readObject();
      // from this line forward you got what you want :D

     }
 }

Надеюсь, что это поможет!