Как преобразовать SimpleOrderedMap в строку JSON или объект JSON? - PullRequest
0 голосов
/ 26 января 2011

Есть ли стандартный способ сделать это?

Ответы [ 3 ]

3 голосов
/ 26 января 2011

Короче говоря: нет, потому что у JSON нет примитивного упорядоченного типа карты.

Первый шаг - определить требования вашего клиента в части декодирования строки JSON. Поскольку в спецификации JSON нет упорядоченного типа карты, вам придется выбрать представление для использования. Выбор, который вы сделаете, будет зависеть от требований вашего клиента к декодированию.

Если у вас есть полный контроль над декодированием строки JSON, вы можете просто закодировать объект в карту по порядку, используя библиотеку JSON, которая гарантированно сериализует вещи в порядке передаваемого итератора.

Если вы не можете этого гарантировать, вам следует самостоятельно представить свое представительство. Два простых примера:

Переменный список:

"[key1, value1, key2, value2]"

Список объектов ввода ключа / значения:

"[{key: key1, val:value1}, {key: key2, val:value2}]"

Как только вы придумали это представление, легко написать простую функцию, которая зацикливается на вашей SimpleOrderedMap. Например:

JSONArray jarray = new JSONArray();
for(Map.Entry e : simpleOrderedMap) {
    jarray.put(e.key());
    jarray.put(e.value());
}
2 голосов
/ 19 мая 2016

Java версия:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.solr.common.util.NamedList;

public class SolrMapConverter {

    @SuppressWarnings({ "unchecked", "rawtypes" })
    public static Object toMap(Object entry) {
        Object response = null;
        if (entry instanceof NamedList) {
            response = new HashMap<>();
            NamedList lst = (NamedList) entry;
            for (int i = 0; i < lst.size(); i++) {
                ((Map) response).put(lst.getName(i), toMap(lst.getVal(i)));
            }
        } else if (entry instanceof Iterable) {
            response = new ArrayList<>();
            for (Object e : (Iterable) entry) {
                ((ArrayList<Object>) response).add(toMap(e));
            }
        } else if (entry instanceof Map) {
            response = new HashMap<>();
            for (Entry<String, ?> e : ((Map<String, ?>) entry).entrySet()) {
                ((Map) response).put(e.getKey(), toMap(e.getValue()));
            }
        } else {
            return entry;
        }
        return response;
    }
}
0 голосов
/ 27 января 2011

Простое добавление полей на карту не будет работать, поскольку сложные объекты (которые не сериализуются в JSON) могут быть там.

Вот отличный код, который делает это.

 protected static toMap(entry){
  def response
  if(entry instanceof SolrDocumentList){
      def docs = []
      response = [numFound:entry.numFound, maxScore:entry.maxScore, start:entry.start, docs:docs]
      entry.each {
          docs << toMap(it)
      }
  } else
  if(entry instanceof List){
      response = []
      entry.each {
          response << toMap(it)
      }
  } else
  if(entry instanceof Iterable){
      response = [:]
      entry.each {
          if(it instanceof Map.Entry)
    response.put(it.key, toMap(it.value))
          else
            response.put(entry.hashCode(), toMap(it))
      }
  } else
 if (entry instanceof Map){
      response = [:]
      entry.each {
          if(it instanceof Map.Entry)
    response.put(it.key, toMap(it.value))
          else
            response.put(entry.hashCode(), toMap(it))
      }
  } else  {
      response = entry
  }
  return response
}
...