Jak przekonwertować skrót do obiektu JSON w Javie


287

Jak przekonwertować lub rzutować skrót do obiektu JSON w Javie i ponownie przekonwertować obiekt JSON na ciąg JSON?

Odpowiedzi:


435

Możesz użyć:

new JSONObject(map);

Uwaga: Działa to tylko dlaMap<String, String>!

Inne funkcje można uzyskać z jego dokumentacji
http://stleary.github.io/JSON-java/index.html


85
Działa to tylko w przypadku ciągu, mapy ciągów, a nie złożonego ciągu, obiektu.
slott

2
Narażasz Mapsię JSONObjectjednak, jak można dostać tę mapę z JSONObject?
Yubaraj,


8
@slott jest odpowiedni dla starszych wersji. Nowsze wersje, takie jak KitKat, działają dobrze z bardziej złożonymi obiektami, takimi jak HashMap <String, Object> () zawierającymi HashMap <String, Object> () jako Object. Więc polecam Gson.
Luismi

Właśnie tego szukałem
Naveed Ahmad

169

Gson może być również wykorzystywany do szeregowania dowolnie złożonych obiektów.

Oto jak z niego korzystasz:

Gson gson = new Gson(); 
String json = gson.toJson(myObject); 

Gsonautomatycznie konwertuje kolekcje na JSONtablice. Gson może serializować prywatne pola i automatycznie ignoruje przejściowe pola.


1
Uwaga: Nie zachowuje to kluczy o wartości zerowej.
Vikas,

58

Przykład użycia json

Map<String, Object> data = new HashMap<String, Object>();
    data.put( "name", "Mars" );
    data.put( "age", 32 );
    data.put( "city", "NY" );
    JSONObject json = new JSONObject();
    json.putAll( data );
    System.out.printf( "JSON: %s", json.toString(2) );

wynik::

JSON: {
  "age": 32,
  "name": "Mars",
  "city": "NY"
}

Możesz także spróbować użyć GSON Google. Google GSON to najlepsza dostępna biblioteka do konwersji Obiektów Java na ich reprezentację JSON.

http://code.google.com/p/google-gson/


2
Przepraszam za wykopaliska, ale co robi 2w json.toString(2 ')
Jack

public String toString (int radix) .toString (2) służy do reprezentacji String. więcej stackoverflow.com/questions/3615721/…
Mohammod Hossain

11
która to klasa JSONObject?
Janus Troelsen

18
Brak takiej metody: (new org.json.JSONObject ()). PutAll ();
Zon

50

Możesz przekonwertować Mapna JSONużywanie Jacksonw następujący sposób:

Map<String,Object> map = new HashMap<>();
//You can convert any Object.
String[] value1 = new String[] { "value11", "value12", "value13" };
String[] value2 = new String[] { "value21", "value22", "value23" };
map.put("key1", value1);
map.put("key2", value2);
map.put("key3","string1");
map.put("key4","string2");

String json = new ObjectMapper().writeValueAsString(map);
System.out.println(json);

Zależności Maven dla Jackson:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.5.3</version>
    <scope>compile</scope>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.5.3</version>
    <scope>compile</scope>
</dependency>

Jeśli korzystasz z JSONObjectbiblioteki, możesz przekonwertować mapę JSONw następujący sposób:

Map<String, Object> map = new HashMap<>();
// Convert a map having list of values.
String[] value1 = new String[] { "value11", "value12", "value13" };
String[] value2 = new String[] { "value21", "value22", "value23" };
map.put("key1", value1);
map.put("key2", value2);

JSONObject json = new JSONObject(map);
System.out.println(json);

Zależności Maven dla JSONObject:

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20140107</version>
</dependency>

Mam nadzieję, że to pomoże. Szczęśliwego kodowania.


1
nie wiedziałem, że mogę przekazać Mapę jako argument, dzięki, bardzo pomogłem.
Gurkha

@Gurkha Dzięki za docenienie.
Ankur Mahajan

1
@AnkurMahajan +1 za udzielenie prawidłowej odpowiedzi w zależności :)
Badman

1
String json = new ObjectMapper (). WriteValueAsString (map); Greate
Rohit Luthra

7

W moim przypadku nie chciałem żadnych zależności. Za pomocą Java 8 możesz pobrać JSON jako ciąg tak prosty:

Map<String, Object> map = new HashMap<>();
map.put("key", "value");
map.put("key2", "value2");
String json = "{"+map.entrySet().stream()
    .map(e -> "\""+ e.getKey() + "\"" + ":\"" + String.valueOf(e.getValue()) + "\"")
    .collect(Collectors.joining(", "))+"}";

2
nie uciekasz ... jeśli klucz lub wartość zawiera ", to się psuje
Janus Troelsen

masz rację, to rozwiązanie ma pewne ograniczenia, zagnieżdżone mapy również nie są obsługiwane
Andrey Sarul

7

Możesz po prostu wyliczyć mapę i dodać pary klucz-wartość do JSONObject

Metoda :

private JSONObject getJsonFromMap(Map<String, Object> map) throws JSONException {
    JSONObject jsonData = new JSONObject();
    for (String key : map.keySet()) {
        Object value = map.get(key);
        if (value instanceof Map<?, ?>) {
            value = getJsonFromMap((Map<String, Object>) value);
        }
        jsonData.put(key, value);
    }
    return jsonData;
}

1
żadnych skrótów i działająca skutecznie bez dodatkowej biblioteki
Maveň ツ

Map.Entry <K, V >> entrySet () służy do iteracji mapy. Czytanie kluczy i przeszukiwanie mapy dla każdego klucza jest nieoptymalnym sposobem.
Martin

7

Biblioteka Underscore-java może konwertować mapę skrótów lub listę tablic na json i vice verse.

import com.github.underscore.lodash.U;
import java.util.*;

public class Main {

    public static void main(String[] args) {

        Map<String, Object> map = new LinkedHashMap<>();
        map.put("1", "a");
        map.put("2", "b");

        System.out.println(U.toJson(map));
        // {
        //    "1": "a",
        //    "2": "b"
        // }
    }
}

5

Późno na imprezę, ale oto mój GSON adhoc pisarzem dla szeregowania hashmap. Musiałem napisać mapę par klucz-wartość jako atrybuty ciągu json, spodziewam się, że jeden z nich będzie liczbą całkowitą. Nie chciałem tworzyć niestandardowego opakowania JavaBean dla tego prostego przypadku.

Klasa GSON JsonWriter jest łatwą w użyciu klasą serializatora zawierającą kilka silnie wpisanych funkcji writer.value ().

// write Map as JSON document to http servlet response
Map<String,String> sd = DAO.getSD(123);
res.setContentType("application/json; charset=UTF-8");
res.setCharacterEncoding("UTF-8");
JsonWriter writer = new JsonWriter(new OutputStreamWriter(res.getOutputStream(), "UTF-8"));
writer.beginObject();
for(String key : sd.keySet()) {
    String val = sd.get(key);
    writer.name(key);
    if (key.equals("UniqueID") && val!=null)
        writer.value(Long.parseLong(val));
    else
        writer.value(val);
}
writer.endObject();
writer.close();

Jeśli żaden z niestandardowych typów nie byłby potrzebny, mógłbym po prostu użyć funkcji toJson (). Biblioteka gson-2.2.4.jar ma nieco mniej niż 190 KB bez żadnych brutalnych zależności. Łatwy w użyciu w dowolnej niestandardowej aplikacji serwletowej lub samodzielnej aplikacji bez dużych integracji z ramami.

Gson gson = new Gson(); 
String json = gson.toJson(myMap); 

4

Zazwyczaj jest to praca biblioteki Json, nie powinieneś próbować tego robić sam. Wszystkie biblioteki json powinny implementować to, o co prosisz, a listę bibliotek Java Json można znaleźć na stronie json.org , na dole strony.


4

Znalazłem inny sposób, aby sobie z tym poradzić.

Map obj=new HashMap();    
obj.put("name","sonoo");    
obj.put("age",new Integer(27));    
obj.put("salary",new Double(600000));   
String jsonText = JSONValue.toJSONString(obj);  
System.out.print(jsonText);

Mam nadzieję że to pomoże.

Dzięki.


3

Jeśli potrzebujesz, użyj go w kodzie.

Gson gsone = new Gson();
JsonObject res = gsone.toJsonTree(sqlParams).getAsJsonObject();

3

Dla tych org.json.simple.JSONObject, którzy używają , możesz przekonwertować mapę na Json String i parsować ją, aby uzyskać JSONObject.

JSONObject object = (JSONObject) new JSONParser().parse(JSONObject.toJSONString(map));

3

Lepiej się spóźnij niż nigdy. Użyłem GSON, aby przekonwertować listę HashMap na ciąg, jeśli chcesz mieć listę zserializowaną.

List<HashMap<String, String>> list = new ArrayList<>();
HashMap<String,String> hashMap = new HashMap<>();
hashMap.add("key", "value");
hashMap.add("key", "value");
hashMap.add("key", "value");
list.add(hashMap);

String json = new Gson().toJson(list);

To jsonprodukuje[{"key":"value","key":"value","key":"value"}]


To nie odpowiada na pytanie. Tworzy tablicę JSON, a nie obiekt JSON. A ktoś inny już pokazał nam, jak utworzyć obiekt JSON na podstawie mapy skrótów Gson.
Stephen C

Cześć @StephenC, niektórzy mogą szukać przykładu tablicy JSON, a nie obiektu JSON, ponieważ jak dotąd najlepszy komentarz zawierał najlepszą odpowiedź. Mam nadzieję, że możemy udzielić innych odpowiedzi związanych z serializacją przy użyciu GSON. Przepraszam, ta odpowiedź powinna zostać opublikowana w innym wątku.
Kelly Budol,

Powinniśmy pisać odpowiedzi dla osób, które prawidłowo wyszukują. Jeśli staramy się zaspokoić potrzeby osób, które nie mogą wyszukiwać, zamieszczając odpowiedzi nie na temat, degraduje witrynę „hałasem” i utrudnia osobom, które potrafią wyszukiwać, znaleźć odpowiednie odpowiedzi. Jeśli (teraz) zgadzasz się, że ta odpowiedź jest w niewłaściwym miejscu, po prostu ją usuń.
Stephen C

1
@KellyBudol dobre lub złe, twoja odpowiedź jest tym, czego szukam. Dzięki Man
vd

2

Oto moje jedno-liniowe rozwiązanie z GSON:

myObject = new Gson().fromJson(new Gson().toJson(myHashMap), MyClass.class);

2

To rozwiązanie działa ze złożonymi kodami JSON:

public Object toJSON(Object object) throws JSONException {
    if (object instanceof HashMap) {
        JSONObject json = new JSONObject();
        HashMap map = (HashMap) object;
        for (Object key : map.keySet()) {
            json.put(key.toString(), toJSON(map.get(key)));
        }
        return json;
    } else if (object instanceof Iterable) {
        JSONArray json = new JSONArray();
        for (Object value : ((Iterable) object)) {
            json.put(toJSON(value));
        }
        return json;
    }
    else {
        return object;
    }
}

2

używamy Gson.

Gson gson = new Gson();
Type gsonType = new TypeToken<HashMap>(){}.getType();
String gsonString = gson.toJson(elements,gsonType);

1

Możesz użyć XStream - to naprawdę przydatne. Zobacz przykłady tutaj

package com.thoughtworks.xstream.json.test;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;

public class WriteTest {

    public static void main(String[] args) {

      HashMap<String,String> map = new HashMap<String,String>();
      map.add("1", "a");
      map.add("2", "b");
      XStream xstream = new XStream(new JettisonMappedXmlDriver());

      System.out.println(xstream.toXML(map));       

    }

}

Ale powinieneś cache'ować swój obiekt xstream każdemu
Joost

1

Jeśli używasz net.sf.json.JSONObject, nie znajdziesz JSONObject(map)w nim konstruktora. Musisz użyć tej public static JSONObject fromObject( Object object )metody. Ta metoda akceptuje ciągi sformatowane w JSON, Maps, DynaBeans i JavaBeans.

JSONObject jsonObject = JSONObject.fromObject(myMap);


1

Jeśli używasz złożonych obiektów, powinieneś zastosować enableComplexMapKeySerialization () , jak podano w https://stackoverflow.com/a/24635655/2914140 i https://stackoverflow.com/a/26374888/2914140 .

Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create();
Map<Point, String> original = new LinkedHashMap<Point, String>();
original.put(new Point(5, 6), "a");
original.put(new Point(8, 8), "b");
System.out.println(gson.toJson(original));

Dane wyjściowe będą:

{
 "(5,6)": "a",
 "(8,8)": "b"
}

1

Nie ma potrzeby analizowania bibliotek Gson ani JSON. Wystarczy użyć new JSONObject(Map<String, JSONObject>).toString()np .:

/**
 * convert target map to JSON string
 *
 * @param map the target map
 * @return JSON string of the map
 */
@NonNull public String toJson(@NonNull Map<String, Target> map) {
    final Map<String, JSONObject> flatMap = new HashMap<>();
    for (String key : map.keySet()) {
        try {
            flatMap.put(key, toJsonObject(map.get(key)));
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
    try {
        // 2 indentSpaces for pretty printing
        return new JSONObject(flatMap).toString(2);
    } catch (JSONException e) {
        e.printStackTrace();
        return "{}";
    }
}

Połknięcie wyjątków i zwrócenie pustego obiektu to zły pomysł.
Stephen C

1
    import org.json.JSONObject;

    HashMap<Object, Object> map = new HashMap<>();
    String[] list={"Grader","Participant"};
    String[] list1={"Assistant","intern"};
    map.put("TeachingAssistant",list);
    map.put("Writer",list1);
    JSONObject jsonObject = new JSONObject(map);
    System.out.printf(jsonObject.toString());

    // Result: {"TeachingAssistant":["Grader","Participant"],"Writer":["Assistant","intern"]}

To tylko powtórzenie wcześniejszej odpowiedzi.
Stephen C

1

Jeśli tak naprawdę nie potrzebujesz HashMap, możesz zrobić coś takiego:

String jsonString = new JSONObject() {{
  put("firstName", user.firstName);
  put("lastName", user.lastName);
}}.toString();

Wynik:

{
  "firstName": "John",
  "lastName": "Doe"
}

No tak. Jednak pytanie dotyczy sposobu utworzenia obiektu JSON zaczynającego się od aHashMap , a to nie odpowiada na to.
Stephen C

Niektórzy ludzie mogą wylądować tutaj z Google w poszukiwaniu ogólnego rozwiązania. Powyższa odpowiedź może im pomóc.
Rafal Enden,

1

Używam Alibaba fastjson, łatwe i proste:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>VERSION_CODE</version>
</dependency>

i importuj:

import com.alibaba.fastjson.JSON;

Następnie:

String text = JSON.toJSONString(obj); // serialize
VO vo = JSON.parseObject("{...}", VO.class); //unserialize

Wszystko w porządku.


1

Jeśli używasz JSR 374: Java API do przetwarzania JSON (javax json) Wydaje się, że to załatwia sprawę:

    JsonObjectBuilder job = Json.createObjectBuilder((Map<String, Object>) obj);
    JsonObject jsonObject = job.build();

0

Możesz użyć Gsona . Ta biblioteka zapewnia proste metody konwertowania obiektów Java na obiekty JSON i odwrotnie.

Przykład:

GsonBuilder gb = new GsonBuilder();
Gson gson = gb.serializeNulls().create();
gson.toJson(object);

Możesz użyć GsonBuilder, gdy chcesz ustawić opcje konfiguracji inne niż domyślne. W powyższym przykładzie proces konwersji spowoduje również serializację zerowych atrybutów z obiektu.

Jednak to podejście działa tylko w przypadku typów innych niż ogólne. W przypadku typów ogólnych musisz użyć toJson (obiekt, typ).

Więcej informacji o Gsonie tutaj .

Pamiętaj, że obiekt musi implementować interfejs Serializable .


0

to działa dla mnie:

import groovy.json.JsonBuilder
properties = new Properties()
properties.put("name", "zhangsan")

println new JsonBuilder(properties).toPrettyString()

1
To nie jest Groovy pytanie.
Stephen C

@ stephen-c java to platforma nie tylko język, groovy to po prostu słój.
jiahut

Kod w twoim pytaniu to nie Java. Jeśli ten kod naprawdę działa dla Ciebie, to nie używasz Javy. Java nie ma instrukcji „println” i nie można zadeklarować takiej zmiennej. Domyślam się, że używasz Groovy, ale nie jestem pewien. Tak czy inaczej, zalecanie ludziom używania bibliotek Groovy zamiast bibliotek Java w kodzie Java ... niezbyt dobry pomysł.
Stephen C

0

Sposób Gsona dla nieco bardziej złożonych map i list przy użyciu metody TypeToken.getParameterized :

Mamy mapę, która wygląda następująco:

Map<Long, List<NewFile>> map;

Otrzymujemy Typ za pomocą wyżej wspomnianej metody getParameterized w następujący sposób:

Type listOfNewFiles = TypeToken.getParameterized(ArrayList.class, NewFile.class).getType();
Type mapOfList = TypeToken.getParameterized(LinkedHashMap.class, Long.class, listOfNewFiles).getType();

A następnie za pomocą Gson obiekt fromJson sposób jak to przy użyciu mapOfList obiektu takiego:

Map<Long, List<NewFile>> map = new Gson().fromJson(fileContent, mapOfList);

Wspomniany obiekt NewFile wygląda następująco:

class NewFile
{
    private long id;
    private String fileName;

    public void setId(final long id)
    {
        this.id = id;
    }

    public void setFileName(final String fileName)
    {
        this.fileName = fileName;
    }
}

Zserializowany JSON wygląda następująco:

{
  "1": [
    {
      "id": 12232,
      "fileName": "test.html"
    },
    {
      "id": 12233,
      "fileName": "file.txt"
    },
    {
      "id": 12234,
      "fileName": "obj.json"
    }
  ],
 "2": [
    {
      "id": 122321,
      "fileName": "test2.html"
    },
    {
      "id": 122332,
      "fileName": "file2.txt"
    },
    {
      "id": 122343,
      "fileName": "obj2.json"
    }
  ]
}


-1

Napotkałem podobny problem podczas deserializacji odpowiedzi z niestandardowych poleceń w selenie. Odpowiedź brzmiała json, ale selen wewnętrznie przekłada to na java.util.HashMap [String, Object]

Jeśli znasz Scala i używasz interfejsu API Play dla JSON, możesz skorzystać z tego:

import play.api.libs.json.{JsValue, Json}
import scala.collection.JavaConversions.mapAsScalaMap


object JsonParser {

  def parse(map: Map[String, Any]): JsValue = {
    val values = for((key, value) <- map) yield {
      value match {
        case m: java.util.Map[String, _] @unchecked => Json.obj(key -> parse(m.toMap))
        case m: Map[String, _] @unchecked => Json.obj(key -> parse(m))
        case int: Int => Json.obj(key -> int)
        case str: String => Json.obj(key -> str)
        case bool: Boolean => Json.obj(key -> bool)
      }
    }

    values.foldLeft(Json.obj())((temp, obj) => {
      temp.deepMerge(obj)
    })
  }
}

Mały opis kodu:

Kod rekurencyjnie przechodzi przez HashMap, aż zostaną znalezione podstawowe typy (String, Integer, Boolean). Te podstawowe typy mogą być bezpośrednio opakowane w JsObject. Po rozwinięciu rekurencji pogłębianie konkatenuje utworzone obiekty.

„@unchecked” zajmuje się ostrzeżeniami dotyczącymi usuwania typu.


To nie jest pytanie Scali
Stephen C

-1

Najpierw przekonwertuj wszystkie obiekty na poprawne ciągi

HashMap<String, String> params = new HashMap<>();
params.put("arg1", "<b>some text</b>");
params.put("arg2", someObject.toString());

Następnie wstaw całą mapę do org.json.JSONObject

JSONObject postData = new JSONObject(params);

Teraz możesz uzyskać JSON, po prostu wywołując metodę toString obiektu

postData.toString()
//{"arg1":"<b>some text<\/b>" "arg2":"object output"}

Utwórz nowy JSONObject

JSONObject o = new JSONObject(postData.toString());

Lub jako tablica bajtów do wysyłania przez HTTP

postData.toString().getBytes("UTF-8");

To mówi to samo, co poprzednie odpowiedzi sprzed lat, bez korzyści zwięzłości.
Stephen C

@StephenC Nie mam pojęcia o czym mówisz
G_V,

@StephenC „Jak przekonwertować lub rzutować skrót do obiektu JSON w Javie i ponownie przekonwertować obiekt JSON na ciąg JSON?”
G_V

362 osoby (i wciąż liczą) sądzi, że stackoverflow.com/a/12155874/139985 odpowiada na pytanie. Mówi w zasadzie to, co mówi twoja odpowiedź bez plisowanych kawałków.
Stephen C
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.