【问题标题】:Java creating json from translation key value pairsJava从翻译键值对创建json
【发布时间】:2021-05-16 01:18:24
【问题描述】:

我有一个键值对的排序列表(按键),如下所示:

administration.edit.error.type1 = val1
administration.edit.error.type2 = val2
administration.edit.success.type1 = val3
administration.label.button.close = val4
administration.label.button.edit = val5
home.label.button.open = val6

我想将此列表转换为

{
    "administration": {
        "edit": {
            "error": {
                "type1": val1,
                "type2": val2,
            },
            "success": {
                "type1": val3
            }
        },
        "label": {
            "button": {
                "close": val4,
                "edit": val5,
            }
        }
    },
    "home": {
        "label": {
            "button": {
                "open": val6
            }
        }
    }
}

提供的输入列表是未知的,以及由点连接的级别
我的方法是递归地遍历列表并使用 Jackson 映射器创建 JsonNodes。有没有更有效的方法来做到这一点?是否有图书馆已经可以做到这一点?

【问题讨论】:

  • 是任何特定类型的值吗?或者只是什么?
  • 它们只是字符串。
  • 在这种情况下,您也许可以使用 JsonNodeFactory 实现一个简单的解析器,并在看到 . 时创建一个对象,并在看到 = 时创建一个字符串。
  • 我会试一试,谢谢!

标签: java json list


【解决方案1】:

来自jackson-dataformat-properties 的JavaPropsMapper 完成这项工作

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.javaprop.JavaPropsMapper;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Properties;

public class Application {

  public static void main(String[] args) throws IOException {

    FileReader fr = new FileReader("/tmp/test.properties");
    Properties properties = new Properties();
    properties.load(fr);

    HashMap map = new JavaPropsMapper().readPropertiesAs(properties, HashMap.class);
    System.out.println(map);

    String json = new ObjectMapper().writeValueAsString(map);
    System.out.println(json);

  }
}

示例文件的输出:

{administration={edit={error={type2=val2, type1=val1}, success={type1=val3}}, label={button={close=val4, edit=val5}}}, home={label={button={open=val6}}}}
{"administration":{"edit":{"error":{"type2":"val2","type1":"val1"},"success":{"type1":"val3"}},"label":{"button":{"close":"val4","edit":"val5"}}},"home":{"label":{"button":{"open":"val6"}}}}

示例使用这些依赖项:

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.11.1</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-properties</artifactId>
            <version>2.11.1</version>
        </dependency>

【讨论】:

  • 太棒了!非常感谢!
猜你喜欢
  • 2019-02-13
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 2017-11-05
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
相关资源
最近更新 更多