#java #arrays #json
#java #массивы #json
Вопрос:
Я использую что-то вроде этого-
String Number1=to_1;
String Number2=to_2;
String[] arrayNumbers = new String[] {(char)34 Number1 (char)34,(char)34 Number2 (char)34};
System.out.println(Arrays.toString(arrayNumbers));
JSONObject jsonObj = new JSONObject();
jsonObj.put("to",Arrays.toString(arrayNumbers));
jsonObj.put("type",type);
jsonObj.put("callback",callbackUrl);
JSONArray array = new JSONArray();
JSONObject Array_item = new JSONObject();
jsonObj.put(type, array);
Array_item.put("caption",captionName);
array.add(Array_item);
System.out.println(jsonObj.toString());
Ожидаемый-
{
"to":["91890xx", "91890xx"],
"type": "document", "document" : {"caption" : "doc"},
"callback":"{{callback}}"
}
Актуально- {"document":[{"caption":"hello"}],"callback":"{{callback}}","to":"["91890xxx", "91890xx"]","type":"document"}
Я больше не знаю логики для удаления двойных кавычек out из to number where, поскольку это относится к строке, где поскольку оба числа должны быть в формате массива, как указано в Expected.
Комментарии:
1. Почему бы вам не использовать просто jsonObj.put(«to»,new JSONArray().put(«»).put(«»))?
Ответ №1:
Сначала я покажу вам правильные коды:
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class Test {
/**
* <pre>
* {
* "to":["91890xx", "91890xx"],
* "type": "document",
* "document" : {"caption" : "doc"},
* "callback":"{{callback}}"
* }
* </pre>
*
* @param args
* @throws JSONException
*/
public static void main(String[] args) throws JSONException {
String number1 = "91890";
String number2 = "91890";
String[] numbers = new String[]{number1, number2};
JSONArray toNode = new JSONArray();
for (String number : numbers) {
toNode.put(number);
}
JSONObject jsonObj = new JSONObject();
jsonObj.put("to", toNode);
jsonObj.put("type", "document");
jsonObj.put("document", new JSONObject().put("caption", "doc"));
jsonObj.put("callback", "{{callback}}");
System.out.println(jsonObj.toString());
}
}
Результат:
{"document":{"caption":"doc"},"callback":"{{callback}}","to":["91890","91890"],"type":"document"}
Если вы хотите создать узел массива josn, вы показываете use JSONArray
и используете JSONArray#put(*)
метод для добавления элементов.
Поместите строку в JSONArray
или JSONObject
, вам не нужно заключать строку в кавычки(«). Кроме того, вы должны написать "
вместо (char) 34
, что немного непонятно в Java.
Следующий регистр используется для ответа на комментарии.
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.math.BigDecimal;
import java.net.URI;
import java.net.URL;
import java.util.*;
public class Test1 {
public static void main(String[] args) throws JSONException {
Map<String, Object> map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", new Date());
map.put("key3", 1);
map.put("key4", null);
map.put("key5", Collections.singletonMap("key5-key1", "value"));
map.put("key6", Arrays.asList(1, 2, 3, 4));
map.put("key7", BigDecimal.TEN);
map.put("key8", new String[]{"a", "b", "c"});
map.put("key9", TestEnum.A);
map.put("key10", new TestEnum[]{TestEnum.A, TestEnum.B, TestEnum.C});
Object json = buildJsonObj(map);
System.out.println(json);
}
private static Object buildJsonObj(Object source) throws JSONException {
if (source == null) {
return null;
}
if (isSimpleValueType(source.getClass())) {
return source;
}
if (source instanceof Map) {
Map<Object, Object> map = (Map<Object, Object>) source;
JSONObject jsonObject = new JSONObject();
for (Map.Entry<Object, Object> entry : map.entrySet()) {
Object key = entry.getKey();
if (!(key instanceof String)) {
throw new IllegalArgumentException("key must be string.");
}
jsonObject.put((String) key, buildJsonObj(entry.getValue()));
}
return jsonObject;
}
if (source instanceof Iterable) {
Iterable<Object> iterable = (Iterable<Object>) source;
JSONArray jsonArray = new JSONArray();
for (Object value : iterable) {
jsonArray.put(buildJsonObj(value));
}
return jsonArray;
}
if (source.getClass().isArray()) {
Object[] array = (Object[]) source;
JSONArray jsonArray = new JSONArray();
for (Object value : array) {
jsonArray.put(buildJsonObj(value));
}
return jsonArray;
}
throw new IllegalArgumentException("Unsupported type: " source ".");
}
private static boolean isSimpleValueType(Class<?> clazz) {
return (Enum.class.isAssignableFrom(clazz) ||
CharSequence.class.isAssignableFrom(clazz) ||
Number.class.isAssignableFrom(clazz) ||
Date.class.isAssignableFrom(clazz) ||
URI.class == clazz || URL.class == clazz ||
Locale.class == clazz);
}
public enum TestEnum {
A, B, C
}
}
Результат:
{"key1":"value1","key2":"Thu Mar 14 20:20:49 CST 2019","key5":{"key5-key1":"value"},"key6":[1,2,3,4],"key3":1,"key9":"A","key7":10,"key8":["a","b","c"],"key10":["A","B","C"]}
Комментарии:
1. У меня есть вопрос, что, если мне нужно использовать ту же функцию и для одного числа. Потому что это выглядит как жестко закодированный.
2. Вы можете определить функцию для этого. Параметром функции может быть map и list / array. И вы используете JSONObject для обработки map, JSONArray для обработки списка / массива. В этих функциях следует использовать рекурсивный алгоритм.
3. Сможете ли вы объяснить на примере?
4. Чувак, ты гений. Спасибо
Ответ №2:
Заменить строку
jsonObj.put(«to»,Arrays.toString(arrayNumbers));
Для
jsonObj.put(«кому», Arrays.asList(arrayNumbers));
Ответ №3:
Вашим значением является строка ‘to’, поэтому не могли бы вы, пожалуйста, преобразовать string в json, после чего вы можете преобразовать json в array.
Ответ №4:
Заменить
jsonObj.put("to",Arrays.toString(arrayNumbers));
С помощью
jsonObj.put("to",arrayNumbers);
Ответ №5:
let a = {"document":[{"caption":"hello"}],"callback":"{{callback}}","to":"["91890xxx", "91890xx"]","type":"document"};
a = JSON.parse(JSON.stringify(a));
let b = JSON.parse(a.to);
a.to = b;
console.log(a);
Ответ №6:
Это точная структура требуемого json.
{
"to": ["91890xx", "91890xx"],
"type": "document",
"document": {
"caption": "doc"
},
"callback": "{{callback}}"
}
Чтобы удалить двойные кавычки, пожалуйста, используйте функцию replace, как показано ниже
String Number1="["91890xxx", "91890xx"]";
Number1.replace("\/", "");
System.out.println("Excepted output:" Number1);
output:
Excepted output:["91890xxx", "91890xx"]