json에 java
도트 표기의 속성을 json으로 쉽게 변환할 수 있는 방법이 있습니까?
예
server.host=foo.bar
server.port=1234
로.
{
"server": {
"host": "foo.bar",
"port": 1234
}
}
쉽지 않은 방법이긴 하지만, 난 그 방법을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"
}
}
}
이것이 도움이 되기를 바랍니다:)
Lightbend config Java 라이브러리 사용(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());
}
다운로드하여 lib에 추가하는 것은 매우 간단합니다.https://code.google.com/p/google-gson/
Gson gsonObj = new Gson();
String strJson = gsonObj.toJson(yourObject);
https://github.com/mikolajmitura/java-properties-to-json 에서 시험해 볼 수 있습니다.
Json은 다음 위치에서 생성할 수 있습니다.
- Java 속성(java.util)에서 가져옵니다.속성)
- 맵(import java.util).맵) -> 맵 <String, String>
- 맵(import java.util).맵) -> 맵 <String, Object>
- inputStream 및 속성(java.io)에서 확인할 수 있습니다.입력 스트림)
- 속성으로 지정된 파일 현지화에서
- 파일(java.io)에서 확인할 수 있습니다.파일)
코드 예:
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에서의 기타 사용 예
gson에 의존하지 않고 Spring 컨트롤러에서 계층형 json을 반환하고 싶었기 때문에 딥 맵으로 충분했습니다.
난 이거면 돼, 열쇠 다 돌려서 빈 지도만 넘겨줘.
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);
}
}
이 https://github.com/nzakas/props2js 를 봐 주세요.수동으로 사용하거나 프로젝트에서 분기하여 사용할 수 있습니다.
약간의 재귀와 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;
}
그냥 사용하다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 문자열을 프로펠러 파일로 읽어 들일 수 있습니다.com.fasterxml.jackson.databind.ObjectMapper
:
HashMap<String,String> result = new ObjectMapper().readValue(jsonPropString, HashMap.class);
Properties props = new Properties();
props.putAll(result);
개인적으로 나는 이 의존관계를 사용했다.
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-properties</artifactId>
<version>2.10.2</version>
<scope>compile</scope>
</dependency>
private static JavaPropsMapper javaPropsMapper = JavaPropsMapper.builder().build();
final JsonNode request = javaPropsMapper.readPropertiesAs(parameters, JsonNode.class);
매핑에서 발생할 수 있는 문제를 방지하기 위해 스키마 검증을 사용해 보십시오.
단순한 오브젝트 맵퍼로도 가능합니다.
Properties properties = new Properties();
properties.put("array", new int[] {1,2,3});
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.writeValueAsString(parameters);
산출량
{"fullname":["Foo","Bar"]}
이 http://www.oracle.com/technetwork/articles/java/json-1973242.html,을 읽어보세요.json과 관련된 몇 가지 클래스가 있습니다.
로컬 파일, jar 내의 내부 리소스 또는 URL로 특정할 수 있는 다른 위치에서 json을 검색하여 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
}
}
도움이 됐으면 좋겠다!
언급URL : https://stackoverflow.com/questions/23871694/java-properties-to-json
'programing' 카테고리의 다른 글
게시 후 폼 값을 유지하는 방법 (0) | 2023.03.04 |
---|---|
여러 개의 . then()은 단일 angularjs 약속에 있습니다.모두 _original_데이터를 사용합니다. (0) | 2023.03.04 |
WordPress 위젯의 동적 입력 필드 (0) | 2023.03.04 |
SQL IN 1000 조항 항목 제한 (0) | 2023.03.04 |
서로 덮어쓰기 CSS 미디어 쿼리 (0) | 2023.03.04 |