2013-06-13 2 views
3

Я пытаюсь создать строку JSON с использованием соответствующей пары ключ/значение. В приведенном ниже коде я пытаюсь перебрать список AttributeValue, а затем я пытаюсь создать строку JSON с помощью al.getValue map.Как создать строку JSON с использованием ключа/значения из карты

private <T> String createJsonWithEscCharacters(List<AttributeValue<T>> list) { 

    StringBuilder keyValue = new StringBuilder(); 

    if (list != null) { 
     for (AttributeValue<?> al: list) { 

      keyValue.append("\"").append("v").append("\"").append(":").append(" {"); 

      for (Map.Entry<String, String> entry : ((Map<String, String>) al.getValue()).entrySet()) { 
       keyValue.append("\"").append(entry.getKey()).append("\""); 
       keyValue.append(":").append(" \"").append(entry.getValue()).append("\"").append(","); 
       System.out.println(keyValue); 
      } 

     } 
    } 

    return null; 
} 

Когда я осмотреть на al, я вижу, как valueLinkedHashMap<K,V> и когда я печатаю al.getValue(), это дает мне this-

{predictedCatRev=0;101;1,1;201;2, predictedOvrallRev=77;2,0;1,16;3, sitePrftblty=77;2,0;1671679, topByrGms=12345.67, usrCurncy=1, vbsTopByrGmb=167167.67} 

Так что означает, что я могу итерирую al.getValue() карты и использовать этот key/value pair для создания строки JSON.

Теперь я пытаюсь сделать строку JSON, итерируя карту al.getValue(). Таким образом, JSON строка должна выглядеть следующим образом после того, как итерация al.getValue() Map-

{ 
"lv": [ 
    { 
    "v": { 
    "predictedCatRev": "0;101;1,1;201;2", 
    "predictedOvrallRev": "77;2,0;1,16;3", 
    "sitePrftblty": "77;2,0;1671679", 
    "topByrGms": "12345.67", 
    "usrCurncy": "1", 
    "vbsTopByrGmb": "167167.67" 
    } 
    } 
], 
} 

Мне интересно, что это самый чистый способ сделать это? В моем вышеприведенном коде я не могу полностью выполнить описанную выше JSON String, но независимо от того, какой код у меня выше, он может сделать небольшую часть JSON String так, как мне было нужно, но не полная JSON String на пути, я находясь в поиске. Может ли кто-нибудь помочь мне в этом, как то, что будет самым чистым способом сделать это?

Благодаря

+4

Почему бы не использовать сериализации библиотек, как GSON который делает все это для вас? –

+0

Вы знаете, что вы можете создать JSONObject с карты, не так ли? См. [This] (http://www.json.org/javadoc/org/json/JSONObject.html#JSONObject (java.util.Map)) – jahroy

+0

Я могу использовать различные библиотеки JSON, но это не даст мне lv 'и' v' в том, как я смотрю в своем фактическом 'JSONString'. Смысл, мне нужно добавить те, 'lv и v' в моем фактическом' JSONString' –

ответ

0

Я предполагаю, что вы хотите отправить JSON обратно в качестве ответа на запрос вызова .. Вы можете использовать рамки Spring, где он автоматически преобразует объект карты в формате JSON с помощью Джексон конвертер. Вам нужно будет просто использовать аннотацию @ResponseBody для возвращаемого типа. Вы можете больше узнать о документации Spring 3.

+0

Я могу использовать различные библиотеки JSON, но это не даст мне lv и v в том, как я смотрю в своем фактическом JSONString. Смысл, мне нужно добавить те, lv и v в моем фактическом JSONString –

+1

, это даст вам json, на который вы смотрите, если у вас есть карта, созданная как «v» и список «v» как lv. , поэтому у вас будет основная карта json - Карта jsonMap = new HasMap(); jsonMap.put ("lv", список v); Возвращение jsonMap даст вам json by Jackson ... –

1

Использование Джексона. Он легкий и быстрый, чем Gson. Он также, как известно, не поставляется в комплекте с OEM-производителями, что может испортить ваш путь к классу.

+0

Я могу использовать различные библиотеки JSON, но это не даст мне lv и v в том, как я смотрю в своем фактическом JSONString. Смысл, мне нужно добавить те, lv и v в моем фактическом JSONString –

+0

@ user21973 - Да, они будут. Вы просто должны правильно использовать библиотеки ;-) – jahroy

2

Не знаете, какую именно задачу вы работаете, но есть много JSON-библиотек для Java, которые могут сделать это для вас, таких как json in java и google-gson. Так, например, в формате JSON в Java, как только вы заполнили все значения в JSONObject, а затем преобразовать его в JSON строку довольно легко:

JSONObject.toString(); // compact JSON string 
JSONObject.toString(int indent); // easier readable format with indention. 

Например, в вашем случае, вы можете создать JSONObject подобно следуйте и вызовите его функцию toString().Это может безопасно ваше время от форматирования строки, чтобы соответствовать формату JSON:

JSONObject jsonObject = new JSONObject(); 
Map<String, String> strStrMap = new HashMap<String, String>(); 

strStrMap.put("hello", "world"); 
strStrMap.put("here is", "an example"); 

jsonObject.put("myMap", strStrMap); 

System.out.println(jsonObject.toString(2)); 

и вот его вывод:

{"myMap": { 
    "hello": "world", 
    "here is": "an example" 
}} 
+0

Я могу использовать различные библиотеки JSON, но они не будут давать мне lv и v в том, как я смотрю в своем реальном JSONString. Смысл, мне нужно добавить те, lv и v в моем фактическом JSONString –

+0

@ user21973: я не понимаю.Если вы создадите правый json-объект, то он наверняка сгенерирует правильный вывод для вас ... – keelar

+1

Я на той же странице, что и @keelar. ОП делает этот ** ПУТЬ ** слишком сложным. Это должно быть предельно простым и не должно ** включать какие-либо головные боли, связанные с ручной конструкцией строки JSON. – jahroy

2

Вы можете просто сделать что-то вроде этого:

import org.json.JSONObject; 

JSONObject rootJo = new JSONObject(); 

for (AttributeValue<?> al : list) { 
    JSONObject mapJo = new JSONObject(al.getValue()); 
    rootJo.put("v", mapJo); 
} 

В другими словами:

  • создать новый (пустой) JSONOb ект по имени rootJo (корень JSON объект)
  • перебрать свой список карт
  • для каждого элемента в списке, преобразовать карту в JSONObject (с использованием библиотеки)
  • добавить новое свойство rootJo (ключ будет v)
  • установить значение v к JSONObject, который был создан из карты

Может быть, я что-то не хватает, но я заменил бы лет Весь ур метод с этим:

/** 
* Creates a JSON object from a list of attributes that 
* have maps as their values. 
*/ 

private JSONObject toJson(List<AttributeValue<?>> attList) { 
    if (attList == null) { 
     return null; 
    } 
    JSONObject jo = new JSONObject(); 
    JSONArray ja = new JSONArray(); 
    for (AttributeValue<?> att : attList) { 
     JSONObject mapJo = new JSONObject(att.getValue()); 
     ja.put("v", mapJo); 
    } 
    jo.put("lv", ja); 
    return jo; 
} 

Вы должны также сделать его типизированным, но я оставлю мелкие детали к вам ...

(плюс я не уверен, что такое AttributeValue есть .. . не может найти его в любом месте)

0

При использовании google gson.

var getRowData = 
[{ 
    "dayOfWeek": "Sun", 
    "date": "11-Mar-2012", 
    "los": "1", 
    "specialEvent": "", 
    "lrv": "0" 
}, 
{ 
    "dayOfWeek": "Mon", 
    "date": "", 
    "los": "2", 
    "specialEvent": "", 
    "lrv": "0.16" 
}]; 

    JsonElement root = new JsonParser().parse(request.getParameter("getRowData")); 
    JsonArray jsonArray = root.getAsJsonArray(); 
    JsonObject jsonObject1 = jsonArray.get(0).getAsJsonObject(); 
    String dayOfWeek = jsonObject1.get("dayOfWeek").toString(); 

// при использовании Джексона

JsonFactory f = new JsonFactory(); 
       ObjectMapper mapper = new ObjectMapper(); 
      JsonParser jp = f.createJsonParser(getRowData); 
      // advance stream to START_ARRAY first: 
      jp.nextToken(); 
      // and then each time, advance to opening START_OBJECT 
     while (jp.nextToken() == JsonToken.START_OBJECT) { 
      Map<String,Object> userData = mapper.readValue(jp, Map.class); 
      userData.get("dayOfWeek"); 
      // process 
      // after binding, stream points to closing END_OBJECT 
     } 
Смежные вопросы