2011-01-26 3 views

ответ

3

Вкратце: нет, поскольку 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()); 
} 
0

Простые добавления полей к карте не будет работать, так как сложные объекты (которые не сериализации в 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 
} 
1

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; 
    } 
} 
Смежные вопросы