如何从文件读取JSON并用值替换对象?

时间:2019-04-22 20:37:16

标签: java json

我需要从文件中读取JSON并替换一些对象。

例如,我有类User.java

public class User {
    String username;
    String email;
    String city;
    String code;
    }

和JSON:

{
    "variables":

        {

        "user":

            {

            "value":

            {

            "username": "$USERNAME",        
            "email": "$EMAIL",   
            "city": "$CITY"
            } 
        }

    }

}

我有两个问题:

  1. 如何从文件读取JSON?读取的JSON将通过WebClient POST API发送。
  2. 如何替换$ USERNAME,$ EMAIL和$ CITY?我不会对其进行硬编码。 我有注册表。当某人填写完表格后,将替换为$ ...

首先,我将JSON硬编码为字符串,但需要从文件中读取

class JSONClass {
    static String toFormat(User user) {
        String jsonUserRegister = "{\n" +
                "    \"variables\":\n" +
                "        {\n" +
                "           \"user\": \n" +
               "           {\n" +
                "               \"value\":\n" +
                "                   {\n" +
               "                \"username\": \"" + user.getUsername() + "\",\n" +
               "                \"email\": \"" + user.getEmail() + "\",\n" +
               "                \"city\": \"" + user.getCity() + "\",\n" +
                "                \"code\": \"" + user.getCode() + "\"\n" +
               "               } }\n" +
              "        }\n" +
               "}";

       return jsonUserRegister;

1 个答案:

答案 0 :(得分:0)

这可以通过使用Spring Boot设置后端来接收客户端调用来实现。因此,要使任务1a正常工作,我们需要在下面

@RestController
public class JsonReaderController {

@Autowired
private ResourceLoader resourceLoader;

@PostMapping(value = "/read-json")
public String fileContent() throws IOException {
    return new String(Files.readAllBytes(
            resourceLoader.getResource("classpath:data/json- sample.json").getFile().toPath()));
  }
}

以上代码只是读取文件内容并以String形式返回。 注意默认响应为Json。

现在我们已经完成了后端,我们需要任务1b-发送POST请求

private String readJsonFile() throws IOException {
    final OkHttpClient client = new OkHttpClient();
    final String requestUrl = "http://localhost:8080/read-json";

    Request request = new Request.Builder()
            .url(requestUrl)
            .post(RequestBody.create(JSON, ""))
            .build();

    try (Response response = client.newCall(request).execute()) {
        //we know its not empty given scenario
        return response.body().string();
    }
}

readJsonFile 方法发出POST请求-使用OkHttp到我们的后端位(在任务1a中完成),并将文件内容返回为json。

对于任务2-将$ USERNAME,$ EMAIL和$ CITY替换为适当的值。为此,我们将使用Apache commons-text库。

 public static void main(String[] args) throws IOException {
    String fileContent = new ReadJsonFromFile().readJsonFile();

    User user = new User("alpha", "alpha@tesrt.com", "Bristol", "alpha");

    Map<String, String> substitutes = new HashMap<>();
    substitutes.put("$USERNAME", user.getUsername());
    substitutes.put("$EMAIL", user.getEmail());
    substitutes.put("$CITY", user.getCity());
    substitutes.put("$CODE", user.getCode());

    StringSubstitutor stringSubstitutor = new StringSubstitutor(substitutes);

    //include double quote prefix and suffix as its json wrapped
    stringSubstitutor.setVariablePrefix("\"");
    stringSubstitutor.setVariableSuffix("\"");

    String updatedContent = stringSubstitutor.replace(fileContent);

    System.out.println(updatedContent);
}

希望这会有所帮助。