Как конвертировать 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.
Другие вопросы по тегам