Как использовать string.format для ниже приведенной строки? - PullRequest
0 голосов
/ 14 января 2020

Как использовать string.format для указанной ниже строки? Я хочу, чтобы значение json было динамическим c, поэтому получаю значения в строке и форматирую их.

String json = "{ \"asin\":\"" + rs.getString("asin") + "\", \"appdetails\": { \"asintype\":\""
            + rs.getString("asintype") + "\",\"app_name\":\"" + rs.getString("appname") + "\", \"app_username\":\""
            + rs.getString("appusername") + "\",\"app_password\":\"" + rs.getString("password")
            + "\",\"service_provider_uname\":\"" + rs.getString("serviceid") + "\",\"service_provider_password\":\""
            + rs.getString("providepassword") + "\",\"marketplace\":\"" + rs.getString("marketplace")
            + "\" , \"accountname\":\"" + deviceDataRS.getString("accountname") + "\", \"deviceusername\":\""
            + deviceDataRS.getString("deviceusername") + "\", \"devicepassword\":\""
            + deviceDataRS.getString("devicepassword") + "\", \"networkname\":\""
            + deviceDataRS.getString("networkname") + "\", \"networkpassword\":\""
            + deviceDataRS.getString("networkpassword") + "\"} }";

Ответы [ 2 ]

2 голосов
/ 14 января 2020

У меня было такое же требование пару лет назад, когда мне приходилось формировать JSON в виде String, используя значения ResultSet, полученные из Database, без создания каких-либо зависимостей POJO class или Object to JSON conversion. Затем я использовал потрясающую библиотеку Apache Commons с именами commons-text и org. apache .commons.text.StringSubstitutor из этой библиотеки для замены динамических c значений заполнителей в String. Библиотеку можно добавить в ваш проект, как показано ниже:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-text</artifactId>
    <version>1.8</version>
</dependency>

Ниже приведен фрагмент кода, который необходим для динамической замены значений заполнителей в строке.

String json = "{ \"asin\":\"<asin>\", \"appdetails\": { \"asintype\":\"<asintype>\"," +
                "\"app_name\":\"<appname>\", \"app_username\":\"<appusername>\",\"app_password\":\"<password>\"," +
                "\"service_provider_uname\":\"<serviceid>\",\"service_provider_password\": \"<providepassword>\"," +
                "\"marketplace\":\"<marketplace>\", \"accountname\":\"<accountname>\", " +
                "\"deviceusername\":\"<deviceusername>\", \"devicepassword\":\"<devicepassword>\", " +
                "\"networkname\":\"<networkname>\", \"networkpassword\":\"<networkpassword>\"}}";

        Map<String, String> values = new HashMap<>();
        values.put("asin", rs.getString("asin"));
        values.put("appdetails", rs.getString("appdetails"));
        values.put("asintype", rs.getString("asintype"));
        values.put("appname", rs.getString("appname"));
        values.put("appusername", rs.getString("appusername"));
        values.put("password", rs.getString("password"));
        values.put("serviceid", rs.getString("serviceid"));
        values.put("providepassword", rs.getString("providepassword"));
        values.put("marketplace", rs.getString("marketplace"));
        values.put("accountname",  deviceDataRS.getString("accountname"));
        values.put("deviceusername",  deviceDataRS.getString("deviceusername"));
        values.put("devicepassword",  deviceDataRS.getString("devicepassword"));
        values.put("networkname",  deviceDataRS.getString("networkname"));
        values.put("networkpassword",  deviceDataRS.getString("networkpassword"));
String finalJson = StringSubstitutor.replace(json, values, "<", ">");

0 голосов
/ 14 января 2020

Несмотря на то, что можно написать JSON с помощью String.format(), запись JSON является настолько распространенной операцией, что существует множество библиотек, которые будут обрабатывать ее для вас. Это предпочтительно, потому что легко ошибиться, когда вы делаете это самостоятельно, особенно позже, когда вы не затрагивали проект некоторое время и изменили свой код.

Подумайте об использовании такой библиотеки, как Джексон , Вы начнете с объекта, который содержит все ваши данные.

class Data {
  public String asin;
  public String asintype;
  public String appname;
  // ...
}

Затем вы можете "упаковать" объект в JSON:

Data data = new Data();
data.asin = "foo";
data.asintype = "bar";
data.appname = "baz";

// Jackson JSON object mapper
ObjectMapper mapper = new ObjectMapper();

// write to file
mapper.writeValue("c:\\data.json", data);

// write to string
String str = mapper.writeValueAsString(data);
System.out.println(str);

У Mkyong есть хороший учебник , который иллюстрирует это более подробно.

Используя String.format(), вы сделаете что-то вроде этого:

String.format("{\"asin\":\"%s\",\"asintype\":\"%s\"}", data.asin, data.asintype);

И я надеюсь, вы увидите, насколько сложно это будет с большой объект, и насколько вы должны быть осторожны, избегая кавычек и поддерживая правильную структуру JSON. Это боль. Не делай этого!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...