Java에서 jsonString을 JSONObject로 변환하는 방법


423

String 변수가 있습니다 jsonString.

{"phonetype":"N95","cat":"WP"}

이제 JSON 객체로 변환하고 싶습니다. Google에서 더 많이 검색했지만 예상 답변을 얻지 못했습니다 ...


1
json 문자열에서 json 객체를 만들고 싶었 기 때문에 dogbane이 제공 한 답변이 올바른 트랙을 보여주었습니다.
Mr. Sajid Shaikh

Mappan과 dogbane의 대답은 모두 정확하지만 다른 모듈을 사용하고 있습니다. JSONObject 모듈이 많으므로 각 모듈에 대해 올바른 모듈을 가져와야합니다.
Arashsoft

나는 GSON 라이브러리로 시도했다. 이 링크를 확인 하십시오 .
Thirumalvalavan

답변:


677

org.json 라이브러리 사용하기 :

try {
     JSONObject jsonObject = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
}catch (JSONException err){
     Log.d("Error", err.toString());
}

7
JSONObject와 같이 시도했습니다. js = new JSONObject (jsonstring); 그러나 오류를 보여줍니다. 에 jsonstring
Mr. Sajid Shaikh

29
그는 org.json을 사용하지 않기 때문에 오류가 발생했습니다. 그런 식으로 작동하지 않는 google-gson을 사용하고 있습니다.
Gubatron

2
@ 구버 트론 (Gubatron) 고마워 친구 당신은 내가 방금 다운로드하고 항아리가 잘 작동하도록 만들었습니다.
Mr. Sajid Shaikh

3
@dogbane 문자열의 구조를 모른다면 어떻게해야합니까? 더 명확하게, 어떻게 동적으로 생성 된 jsonString을 jsonObject로 변환 할 수 있습니까?
Saumyaraj

70
google-gson을 사용하면 다음과 같이 할 수 있습니다.JsonObject obj = new JsonParser().parse(jsonString).getAsJsonObject();
kazy

163

여전히 답을 찾는 사람에게 :

JSONParser parser = new JSONParser();
JSONObject json = (JSONObject) parser.parse(stringToParse);

23
그리고 같은 패키지를 가져올 패키지를 언급 ​​할 수 있습니까?
gonephishing

10
이것은 나를 위해 일하고 있습니다 :import org.json.simple.JSONObject
Mafro34

1
json-simple 버전 1.1.1에 문제가있는 것 같습니다. 위의 내용은 "처리되지 않은 예외" parser.parse(이며 try-catch 또는 throw를 원합니다. 그러나 하나를 추가하면 Maven depedencies에 json-simple이 있고 프로젝트 라이브러리에 명확하게 표시되는 경우에도 Unhandled exception type ParseExceptionParseException에 대해 오류 또는 NoClassDefFound 오류가 발생합니다 org.json.simple.parser.
Juha Untinen

2
org.json은 개념 증명 라이브러리입니다. 성능과 기능면에서 최악 중 하나입니다. 선택하기 전에 json lib의 기능 세트와 성능을 살펴 봐야합니다. 내가 JMH를 사용 하여이 벤치 마크를 참조하십시오 : github.com/fabienrenaud/java-json-benchmark Jackson 은 다른 것보다 빠르며 org.json보다 5-6 배 빠릅니다.
fabien 2016 년

5
JSONParser 파서 = 새로운 JSONParser (); depricated 것 같다
Ouissal

46

사용할 수 있습니다 google-gson. 세부:

객체 예

class BagOfPrimitives {
  private int value1 = 1;
  private String value2 = "abc";
  private transient int value3 = 3;
  BagOfPrimitives() {
    // no-args constructor
  }
}

(직렬화)

BagOfPrimitives obj = new BagOfPrimitives();
Gson gson = new Gson();
String json = gson.toJson(obj); 
==> json is {"value1":1,"value2":"abc"}

순환 참조를 사용하여 객체를 직렬화 할 수 없으므로 무한 재귀가 발생합니다.

(직렬화 해제)

BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class);  
==> obj2 is just like obj

Gson의 또 다른 예 :

Gson은 배우고 구현하기 쉬우므로 다음 두 가지 방법을 알아야합니다.

-> toJson () – Java 객체를 JSON 형식으로 변환

-> fromJson () – JSON을 자바 객체로 변환

import com.google.gson.Gson;

public class TestObjectToJson {
  private int data1 = 100;
  private String data2 = "hello";

  public static void main(String[] args) {
      TestObjectToJson obj = new TestObjectToJson();
      Gson gson = new Gson();

      //convert java object to JSON format
      String json = gson.toJson(obj);

      System.out.println(json);
  }

}

산출

{"data1":100,"data2":"hello"}

자원:

Google Gson 프로젝트 홈페이지

Gson 사용자 안내서


"클라이언트 측에서 처리하도록 요청하는 경우 프로그래밍 언어에 따라 다릅니다. 예를 들어 Java의 경우 google-gson을 사용할 수 있습니다." 아마도 "client"가 아닌 "server"를 의미한다고 생각합니다. 그리고 "자바"라는 질문에 태그를 달았습니다.
TJ Crowder

+1. 나는 지금 4-5 프로젝트에서 매우 다른 상황, 서버 및 클라이언트 측 (Android 앱에서도)에서 Gson을 사용했으며 결코 실패하지 않았습니다. 아주 좋고 깨끗한 lib.
Jonik

gson을 사용하고 싶지만 사전 정의 된 POJO 클래스가없는 경우 (즉, 사전 정의 된 구조가없는 일반 json이있는 경우)이 답변이 도움이 될 수 있습니다.- stackoverflow.com
Leandro David

40

JSON 홈페이지 에서 링크 된 다양한 Java JSON 시리얼 라이저 및 디시리얼라이저가 있습니다 .

이 글을 쓰는 시점에서 다음 22 가지가 있습니다.

물론 목록은 바뀔 수 있습니다.


24

자바 7 솔루션

import javax.json.*;

...

String TEXT;
JsonObject body = Json.createReader(new StringReader(TEXT)).readObject()

;


5
이 라이브러리는 가장 성능이 떨어집니다. 내가 JMH로 한이 벤치 마크를보십시오 : github.com/fabienrenaud/java-json-benchmark
fabien

15

변환하다 StringJSONObject당신이 바로 전달해야 String의 생성자로 인스턴스를JSONObject .

예 :

JSONObject jsonObj = new JSONObject("your string");

10

나는 이것을 위해 google-gson을 사용하고 싶습니다. 정확하게 JSONObject로 작업 할 필요가 없기 때문입니다.

이 경우 JSON 객체의 속성에 해당하는 클래스가 있습니다.

class Phone {
 public String phonetype;
 public String cat;
}


...
String jsonString = "{\"phonetype\":\"N95\",\"cat\":\"WP\"}";
Gson gson = new Gson();
Phone fooFromJson = gson.fromJson(jsonString, Phone.class);
...

그러나 귀하의 질문은 JSON 문자열의 실제 JSONObject 객체로 어떻게 끝나는가와 비슷하다고 생각합니다.

나는 google-json api를보고 있었고 org.json의 api와 같은 것을 찾을 수 없었습니다. 이것은 아마도 JSONObject를 사용해야 할 때 사용하고 싶을 것입니다.

http://www.json.org/javadoc/org/json/JSONObject.html

org.json.JSONObject (완전히 다른 API)를 사용하여 다음과 같은 작업을 수행하려는 경우 ...

JSONObject jsonObject = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
System.out.println(jsonObject.getString("phonetype"));

google-gson의 장점은 JSONObject를 처리 할 필요가 없다는 것입니다. json을 가져 와서 직렬화 해제하려는 클래스를 전달하면 클래스 속성이 JSON과 일치하지만 다시 모든 사람이 고유 한 요구 사항을 갖습니다. JSON 생성 측면에서 일이 너무 동적 일 수 있으므로 역 직렬화 측면 이 경우 json.org를 사용하십시오.


8

org.json을 가져와야합니다.

JSONObject jsonObj = null;
        try {
            jsonObj = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
        } catch (JSONException e) {
            e.printStackTrace();
        }

8

Jacksonwith를 사용하여 JSON에 문자열com.fasterxml.jackson.databind :

json-string이 다음과 같다고 가정합니다. jsonString = { "phonetype": "N95", "cat": "WP"}

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
 * Simple code exmpl
 */
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(jsonString);
String phoneType = node.get("phonetype").asText();
String cat = node.get("cat").asText();

3

http://json-lib.sourceforge.net (net.sf.json.JSONObject)을 사용중인 경우

꽤 쉽습니다.

String myJsonString;
JSONObject json = JSONObject.fromObject(myJsonString);

또는

JSONObject json = JSONSerializer.toJSON(myJsonString);

json.getString (param), json.getInt (param) 등으로 값을 가져옵니다.


JSONObject json = JSONSerializer.toJSON (myJsonString); 다른 작품의 불일치 오류가 발생합니다
Henrique C.

3

문자열을 json으로 변환하고 찌르는 것은 json과 같습니다. { "phonetype": "N95", "cat": "WP"}

String Data=response.getEntity().getText().toString(); // reading the string value 
JSONObject json = (JSONObject) new JSONParser().parse(Data);
String x=(String) json.get("phonetype");
System.out.println("Check Data"+x);
String y=(String) json.get("cat");
System.out.println("Check Data"+y);

JSONParser 란 무엇입니까? 연락처 제공자의 일부입니까?
IgorGanapolsky

1
@IgorGanapolsky JSONParser는 간단한 JSON에서 제공하는 옵션입니다. 이 작업을 수행하려면, JSON-간단한-1.1.1.jar을 포함
라빈 Cheekkallur

3

일반 Json 구문 분석에 fasterxml의 JsonNode를 사용하십시오. 내부적으로 모든 입력에 대한 키 값의 맵을 작성합니다.

예:

private void test(@RequestBody JsonNode node)

입력 문자열 :

{"a":"b","c":"d"}

2

외부 라이브러리를 사용할 필요가 없습니다.

대신이 클래스를 사용할 수 있습니다 :) (list, nested list 및 json 처리)

public class Utility {

    public static Map<String, Object> jsonToMap(Object json) throws JSONException {

        if(json instanceof JSONObject)
            return _jsonToMap_((JSONObject)json) ;

        else if (json instanceof String)
        {
            JSONObject jsonObject = new JSONObject((String)json) ;
            return _jsonToMap_(jsonObject) ;
        }
        return null ;
    }


   private static Map<String, Object> _jsonToMap_(JSONObject json) throws JSONException {
        Map<String, Object> retMap = new HashMap<String, Object>();

        if(json != JSONObject.NULL) {
            retMap = toMap(json);
        }
        return retMap;
    }


    private static Map<String, Object> toMap(JSONObject object) throws JSONException {
        Map<String, Object> map = new HashMap<String, Object>();

        Iterator<String> keysItr = object.keys();
        while(keysItr.hasNext()) {
            String key = keysItr.next();
            Object value = object.get(key);

            if(value instanceof JSONArray) {
                value = toList((JSONArray) value);
            }

            else if(value instanceof JSONObject) {
                value = toMap((JSONObject) value);
            }
            map.put(key, value);
        }
        return map;
    }


    public static List<Object> toList(JSONArray array) throws JSONException {
        List<Object> list = new ArrayList<Object>();
        for(int i = 0; i < array.length(); i++) {
            Object value = array.get(i);
            if(value instanceof JSONArray) {
                value = toList((JSONArray) value);
            }

            else if(value instanceof JSONObject) {
                value = toMap((JSONObject) value);
            }
            list.add(value);
        }
        return list;
    }
}

JSON 문자열을 해시 맵으로 변환하려면 다음 사용하십시오.

HashMap<String, Object> hashMap = new HashMap<>(Utility.jsonToMap(

2

코드 하우스 잭슨 -2012 년부터 RESTful 웹 서비스 및 JUnit 테스트에서이 멋진 API를 사용하고 있습니다. API를 사용하면 다음을 수행 할 수 있습니다.

(1) JSON 문자열을 Java Bean으로 변환

public static String beanToJSONString(Object myJavaBean) throws Exception {
    ObjectMapper jacksonObjMapper = new ObjectMapper();
    return jacksonObjMapper.writeValueAsString(myJavaBean);
}

(2) JSON 문자열을 JSON 객체로 변환 (JsonNode)

public static JsonNode stringToJSONObject(String jsonString) throws Exception {
    ObjectMapper jacksonObjMapper = new ObjectMapper();
    return jacksonObjMapper.readTree(jsonString);
}

//Example:
String jsonString = "{\"phonetype\":\"N95\",\"cat\":\"WP\"}";   
JsonNode jsonNode = stringToJSONObject(jsonString);
Assert.assertEquals("Phonetype value not legit!", "N95", jsonNode.get("phonetype").getTextValue());
Assert.assertEquals("Cat value is tragic!", "WP", jsonNode.get("cat").getTextValue());

(3) Java Bean을 JSON 문자열로 변환

    public static Object JSONStringToBean(Class myBeanClass, String JSONString) throws Exception {
    ObjectMapper jacksonObjMapper = new ObjectMapper();
    return jacksonObjMapper.readValue(JSONString, beanClass);
}

REFS :

  1. 코드 하우스 잭슨

  2. JsonNode API -JsonNode 객체의 값을 사용, 탐색, 구문 분석 및 평가하는 방법

  3. 학습서 -Jackson을 사용하여 JSON 문자열을 JsonNode로 변환하는 간단한 학습서


1

인터페이스를 직렬화 해제하는 GSON은 다음과 같은 예외가 발생합니다.

"java.lang.RuntimeException: Unable to invoke no-args constructor for interface XXX. Register an InstanceCreator with Gson for this type may fix this problem."

역 직렬화하는 동안; GSON은 해당 인터페이스에 어떤 개체를 초기화해야하는지 모릅니다.

이것은 어떻게 든 여기서 해결 됩니다 .

그러나 FlexJSON 에는이 솔루션이 본질적으로 있습니다. 시간을 직렬화하는 동안 아래와 같이 json의 일부로 클래스 이름을 추가합니다.

{
    "HTTPStatus": "OK",
    "class": "com.XXX.YYY.HTTPViewResponse",
    "code": null,
    "outputContext": {
        "class": "com.XXX.YYY.ZZZ.OutputSuccessContext",
        "eligible": true
    }
}

따라서 JSON은 다소 번거 롭습니다. 그러나 InstanceCreatorGSON에 필요한 쓰기 는 필요 하지 않습니다 .


1

사용 org.json

JSON 형식 텍스트를 포함하는 문자열이있는 경우 다음 단계에 따라 JSON 오브젝트를 얻을 수 있습니다.

String jsonString = "{\"phonetype\":\"N95\",\"cat\":\"WP\"}";
JSONObject jsonObj = null;
    try {
        jsonObj = new JSONObject(jsonString);
    } catch (JSONException e) {
        e.printStackTrace();
    }

전화 유형에 액세스하려면

Sysout.out.println(jsonObject.getString("phonetype"));

0

json 단일 객체를 목록으로 설정하려면

"locations":{

}

~에 List<Location>

사용하다

ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);

jackson.mapper-asl-1.9.7.jar


0

org.json.simple.JSONObject를 사용하여 문자열을 Json Object로 변환

private static JSONObject createJSONObject(String jsonString){
    JSONObject  jsonObject=new JSONObject();
    JSONParser jsonParser=new  JSONParser();
    if ((jsonString != null) && !(jsonString.isEmpty())) {
        try {
            jsonObject=(JSONObject) jsonParser.parse(jsonString);
        } catch (org.json.simple.parser.ParseException e) {
            e.printStackTrace();
        }
    }
    return jsonObject;
}

-1

더 나은 org.jsonlib 를 사용하여 더 간단한 방법으로 이동하십시오 . 다음과 같이 매우 간단한 접근법을 수행하십시오.

JSONObject obj = new JSONObject();
obj.put("phonetype", "N95");
obj.put("cat", "WP");

이제 각 String obj의 변환 된 JSONObject형식입니다. 이름-값 쌍이있는 경우에 해당됩니다.

문자열의 경우의 생성자로 직접 전달할 수 있습니다 JSONObject. 유효한 json String경우에는 예외가 발생합니다.


당신이 쓴 것을 말 그대로 user.put("email", "someemail@mail.com")처리 : 처리되지 않은 예외가 발생합니다.
Sebastialonso

1
@Sebastialonso 예, 예외를 잡아야합니다. : 이것처럼try {JSONObject jObj = new JSONObject();} catch (JSONException e) {Log.e("MYAPP", "unexpected JSON exception", e);// Do something to recover.}
TheLittleNaruto

@vidya 아니에요. 다시 비교해보십시오.
TheLittleNaruto

@vidya 물론 야
TheLittleNaruto
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.