Как конвертировать jCard в первоклассный JSON?
Мне нужен стабильный и безопасный алгоритм преобразования (любой язык), который может производить окончательный вывод в виде объектов " первого класса" JSON. Пример:
Формат jCard:
[["version", {}, "text", "4.0"],["fn", {}, "text", "Forrest Gump"]]
Первоклассный формат JSON:
{"version":"4.0","fn":"Forrest Gump"}
,
2 ответа
Сначала в python я создаю одну функцию с именем jcard_to_json, которая принимает jCard в качестве входных данных и преобразует ее в «первоклассный» объект JSON. Функция перебирает элементы в jCard и для каждого элемента добавляет пару ключ-значение в словарь json_obj, где ключ — это первый элемент в элементе jCard, а значение — четвертый элемент.
Пример:-
def jcard_to_json(jcard):
json_obj = {}
for item in jcard:
json_obj[item[0]] = item[3]
return json_obj
jcard = [["version", {}, "text", "4.0"], ["fn", {}, "text", "Forrest
Gump"]]
json_obj = jcard_to_json(jcard)
В Яве.
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class JCardTest {
public static void main(String[] args) throws JSONException {
String jcardStr = "[\"vcard\","
+ " ["
+ " [\"version\", {}, \"float\", \"4.0\"],"
+ " [\"fn\", {}, \"text\", \"John Doe\"],"
+ " [\"gender\", {}, \"text\", \"M\"],"
+ " [\"categories\", {}, \"text\", \"computers\", \"cameras\"],"
+ " [\"number\", {}, \"integer\", 12345],"
+ " [\"adr\","
+ " { \"type\": \"work\" },"
+ " \"text\","
+ " ["
+ " \"\","
+ " \"Suite D2-630\","
+ " \"2875 Laurier\","
+ " \"Quebec\","
+ " \"QC\","
+ " \"G1V 2M2\","
+ " \"Canada\""
+ " ]"
+ " ]"
+ " ]"
+ " ]";
JSONArray jcard = new JSONArray(jcardStr);
jcard = jcard.getJSONArray(1);
JSONObject result = new JSONObject();
for (int i = 0; i < jcard.length(); i++) {
JSONArray arr = jcard.getJSONArray(i);
String name = arr.getString(0);
String dataType = arr.getString(2);
if (arr.length() == 4) {
switch (dataType) {
case "integer": {
long val = arr.getLong(3);
result.put(name, val);
}
break;
case "float": {
double val = arr.getDouble(3);
result.put(name, val);
}
break;
default:
Object val = arr.get(3);
if (val instanceof JSONArray) {
result.put(name, (JSONArray) val);
} else {
result.put(name, val.toString());
}
break;
}
} else {
JSONArray resArr = new JSONArray();
for (int j = 3; j < arr.length(); j++) {
resArr.put(arr.get(j).toString());
}
result.put(name, resArr);
}
}
System.out.println(result);
}
}
- При этом игнорируется часть «параметров» (arr.get(1)) записей jCard.
- код многословен, чтобы не скрывать важные детали. можно было бы написать более компактно.
- Пример основан на примерах в jCard RFC7095.