Java ME에서 JSON 문자열을 객체로 변환 하시겠습니까?


116

Java / J2ME에 다음과 같은 문자열을 변환하는 방법이 있습니까?

{name:"MyNode", width:200, height:100}

한 줄의 코드에서 동일한 내부 개체 표현에?

현재 방법이 너무 지루하기 때문에 :

Object n = create("new");
setString(p, "name", "MyNode");
setInteger(p, "width", 200);
setInteger(p, "height", 100);

아마도 JSON 라이브러리일까요?


6
귀하의 문자열은 실제로 Json 객체가 아닙니다. Json 표준을 참조하십시오. JavaScript 표기법과 비슷합니다.
PhiLho

19
@Jeremy Rudd :되어야합니다{"name":"MyNode", "width":200, "height":100}
Esteban Küber

1
@voyager : 알고 있지만 JavaScript는 기본적으로 따옴표없이 속성 이름을 지원합니다.
TheFlash

1
@PhiLho : 알고 있지만 명확성을 위해 이렇게 유지했습니다. SO 구문 하이 라이터가 엉망으로 만들었을 것입니다. 이름과 값은 빨간색입니다.
TheFlash

Java의 핵심 API를 사용하여 변환을 수행하는 방법이 있습니까? 아마도 Java 8에서? 자바 9?
AlikElzin-kilaka

답변:


108

몇 가지를 사용했는데 제가 가장 좋아하는 것은

http://code.google.com/p/json-simple/

라이브러리는 매우 작기 때문에 J2ME에 적합합니다.

다음과 같이 한 줄로 JSON을 Java 객체로 구문 분석 할 수 있습니다.

JSONObject json = (JSONObject)new JSONParser().parse("{\"name\":\"MyNode\", \"width\":200, \"height\":100}");
System.out.println("name=" + json.get("name"));
System.out.println("width=" + json.get("width"));

1
애플릿에서이 라이브러리를 사용할 수 있습니까? Reflection을 사용하면 reflectpermission 오류에 직면하게됩니다. 작동할까요?
Mridang Agarwalla

jsonSimple에 여전히 JSONParser 클래스가 있습니까? 수업을 부를 수 없습니다.
phuwin

JSONParser는 이제 더 이상 사용되지 않습니다.
Varda Elentári

79

가장 간단한 옵션은 Jackson입니다 .

MyObject ob = new ObjectMapper().readValue(jsonString, MyObject.class);

유사하게 사용하기 쉬운 다른 라이브러리가 있습니다 (Gson은 이미 언급했습니다). 그러나 일부 선택은 원래 org.json 라이브러리와 같이 더 힘들어서 중간 "JSONObject"가 필요하지 않더라도 생성해야합니다.


Jackson은 J2ME를 지원하지 않습니다
skue

사실, j2me가 여전히 대략 JDK 1.4 수준 인 경우 (Jackson은 1.5 필요)
StaxMan

1
당신은 단지 2 개의 상승을 가지고 있지만 더 많은 가치가 있습니다. Jackson은 우리 앱에 플러그인하기가 정말 쉬웠습니다. 추천 해 주셔서 감사합니다.
Dan Doyon

1
Jackson은 일반 객체로 역 직렬화 할 수도 있습니다. 예. Object obj = new ObjectMapper().readValue("[1, 2, 3]", Object.class);
neoneye 2014-12-29

잭슨를 사용하여 더 많은 코드 예제 mkyong.com/java/how-to-convert-java-object-to-from-json-jackson
cellepo을

61

GSON은 자바 객체를 json 객체로 또는 그 반대로 변환하는 좋은 옵션입니다.
Google에서 제공하는 도구입니다.

json을 java 객체 fromJson(jsonObject,javaclassname.class)
로 변환 하는 경우 : java 객체를 json 객체로 변환하는 경우 :toJson(javaObject)
나머지는 자동으로 수행됩니다.

자세한 정보 및 다운로드


1
+1 비슷한 것을 찾고 있었는데 이것은 계산서에 완벽하게 맞습니다!
Roy Tang

23

Google GSON으로 쉽게 할 수 있습니다.

user, width 및 height 필드가있는 User라는 클래스가 있고 다음 json 문자열을 User 객체로 변환하려고한다고 가정 해 보겠습니다.

{"name":"MyNode", "width":200, "height":100}

다음 코드를 사용하면 캐스트 할 필요없이 (nimcap의 주석을 염두에두고;)) 쉽게 수행 할 수 있습니다.

Gson gson = new Gson(); 
final User user = gson.fromJson(jsonString, User.class);

여기서 jsonString은 위의 JSON 문자열입니다.

자세한 내용은 https://code.google.com/p/google-gson/참조하십시오.


3
그리고 네, 질문이 4 년 전에 요청되었다는 것을 알고 있지만 제 대답은 현재이 작업을 수행해야하는 이해 당사자를위한 것입니다. :) 누군가에게 도움이되기를 바랍니다!
sufinawaz

22

Java 용 JSON 파서 가 많이 있습니다 .

  • JSONObject.java
    JSONObject는 이름 / 값 쌍의 정렬되지 않은 모음입니다. 외부 형식은 이름과 값 사이에 콜론이 있고 값과 이름 사이에 쉼표가있는 중괄호로 묶인 문자열입니다. 내부 형식은 이름으로 값에 액세스하기위한 get () 및 opt () 메소드와 이름으로 값을 추가하거나 대체하기위한 put () 메소드가있는 객체입니다. 값은 Boolean, JSONArray, JSONObject, Number 및 String 또는 JSONObject.NULL 객체 유형 중 하나 일 수 있습니다.

  • JSONArray.java
    JSONArray는 순서가 지정된 값 시퀀스입니다. 외부 형식은 값 사이에 쉼표를 사용하여 대괄호로 묶인 문자열입니다. 내부 형식은 인덱스로 값에 액세스하기위한 get () 및 opt () 메소드와 값을 추가하거나 대체하기위한 put () 메소드를 갖는 객체입니다. 값은 Boolean, JSONArray, JSONObject, Number 및 String 또는 JSONObject.NULL 객체 유형 중 하나 일 수 있습니다.

  • JSONStringer.java
    JSONStringer는 JSON 텍스트를 빠르게 생성하기위한 도구입니다.

  • JSONWriter.java
    JSONWriter는 스트림에 JSON 텍스트를 빠르게 작성하기위한 도구입니다.

  • JSONTokener.java
    JSONTokener는 소스 문자열을 가져 와서 문자와 토큰을 추출합니다. JSONObject 및 JSONArray 생성자가 JSON 소스 문자열을 구문 분석하는 데 사용됩니다.

  • JSONException.java
    구문 또는 프로 시저 오류가 감지되면 JSONException이 발생합니다.

  • JSONString.java
    JSONString은 클래스가 JSON 직렬화를 구현할 수 있도록하는 인터페이스입니다.


1
J2ME에 java.io.IOException이있는 경우; java.io.Writer; java.lang.reflect.Field; java.lang.reflect.Modifier; java.lang.reflect.Method; java.util.Collection; java.util.HashMap; java.util.Iterator; java.util.Map; java.util.TreeSet; 그런 다음 간단한 java클래스 이므로 첫 번째 것을 사용할 수 있습니다 .
Esteban Küber

2
MIDP 2.0에는 java.lang.reflect 패키지가 없다고 생각합니다. 일반 파서를 만들기 어렵게 만들 것입니다 ...
PhiLho

2
똑똑한 사람, voyager, 표준 Java JSON 클래스의 문서를 방금 복사했습니다.
TheFlash

@Jeremy Rudd : 당연히 내가 그랬는데 어떻게 그렇게 빨리했다고 생각하니? 당신을 트롤하려는 시도가 아니었고, 링크와 카피 모두에 대한 표준 관행입니다. 그렇게 나오면 미안 해요.
Esteban Küber

10
질문에 대한 답변이 아니기 때문에 나는 이것을 반대 투표했습니다. 관련 클래스 목록을 제공하지만 실제로 질문자가 원하는 것을 수행하는 것은 없습니다.
Jeff Martin

7

JSON 공식 사이트 는 당신이 봐야 할 곳입니다. Java와 함께 사용할 수있는 다양한 라이브러리를 제공하며, 개인적으로이 사이트에서 작업을 구현 한 JSON-lib 를 사용했기 때문에이 페이지 에서 정확히 동일한 클래스 메서드 등을 가지고 있습니다.

html 링크를 클릭하면 원하는 것을 찾을 수 있습니다.

요컨대 :

json 객체와 json 배열을 만드는 코드는 다음과 같습니다.

JSONObject obj = new JSONObject();
obj.put("variable1", o1);
obj.put("variable2", o2);
JSONArray array = new JSONArray();
array.put(obj);

o1, o2는 기본 유형 (long, int, boolean), 문자열 또는 배열 일 수 있습니다.

그 반대의 과정은 상당히 간단합니다. 즉, 문자열을 json 객체 / 배열로 변환하는 것입니다.

String myString;

JSONObject obj = new JSONObject(myString);

JSONArray array = new JSONArray(myString);

올바르게 구문 분석하려면 배열이나 객체를 구문 분석하고 있는지 알아야합니다.



5

이미 많은 사람들이 언급했듯이 JSON을 사용하는 매우 간단한 방법은 아래와 같습니다.

import org.json.JSONObject;

String someJsonString = "{name:"MyNode", width:200, height:100}";
JSONObject jsonObj = new JSONObject(someJsonString);

그런 다음 jsonObj를 사용하여 JSON 개체를 처리합니다. 예 : jsonObj.get ( "name");

아래 링크에 따라 JSON.simple은 작고 큰 JSON 파일 모두에 대해 일정한 효율성을 보여줍니다.

http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/


많은 사람들이 이미 게시 한 제안을 언급했다고 썼습니다. 답변의 본질은 무엇입니까?
dakab

1
@dakab 귀하의 의견에 감사드립니다. 이 질문의 핵심은 목적을 수행하는 한 줄의 코드를 제공하는 것이 었습니다. 이 작업을 수행 할 수있는 많은 API가 있기 때문에 API의 효율성 비교에 대한 추가 정보도 제공하고 싶었습니다. 그래서 제가 의미 한이 답변의 본질은이 스레드에서 다른 동료들이 언급 한 다른 API의 효율성 비교에 대한 코드 + 정보를 제공하는 것입니다.
Kripz


3

이것은 오래된 질문이며 json-simple ( https://code.google.com/p/json-simple/ )은 그 당시 좋은 해결책이 될 수 있지만 프로젝트가 한동안 활성화되지 않은 것 같습니다!

이제 https://github.com/google/gson 에서 호스팅되는 Gson을 제안합니다.

성능이 문제인 경우 비교하는 일부 벤치 마크 http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/ 을 살펴볼 수 있습니다 .



2

json.org를 사용하여 JSON을 구문 분석하는 라이브러리를 작성했지만 실제로는 인터페이스의 프록시를 생성합니다. 코드 / JAR은 code.google.com에 있습니다.

http://fixjures.googlecode.com/

J2ME에서 작동하는지 모르겠습니다. Java Reflection을 사용하여 프록시를 생성하기 때문에 작동하지 않을 것이라고 생각합니다. 또한 현재 제거하고 싶은 Google 컬렉션에 대한 의존도가 높고 사용자의 요구에 비해 너무 무겁지만 원하는 방식으로 JSON 데이터와 상호 작용할 수 있습니다.

interface Foo {
    String getName();
    int getWidth();
    int getHeight();
}

Foo myFoo = Fixjure.of(Foo.class).from(JSONSource.newJsonString("{ name : \"foo name\" }")).create();
String name = myFoo.getName(); // name now .equals("foo name");

놀랍지 만 Foo는 원하지 않지만 기본 개체 만 있습니다.
TheFlash

2

다음 Json String을 사용하여 Java에서 Json 객체를 만드십시오.

{name:"MyNode", width:200, height:100}

위가 Json string 인 경우 Json 객체를 만듭니다.

JsonString ="{name:"MyNode", width:200, height:100}";
JSONObject yourJsonObject = new JSONObject(JsonString);
System.out.println("name=" + yourJsonObject.getString("name"));
System.out.println("width=" + yourJsonObject.getString("width"));

2

큰 파일의 경우 Jackson , 작은 파일의 경우 GSON , 둘 다 처리하는 JSON.simple .


1
증거는 여기에서 thanga의 코멘트 @ 백업 할 blog.takipi.com/...
Gob00st

나는 전에도 보았지만 작은 파일은 어쨌든 파싱이 빠르다고 생각합니다. Jackson에 비해 30 % 정도의 차이가 합산 될 곳을 파싱 할 작은 파일 톤이있는 경우에만 JSON.simple에 대해 생각할 것입니다. 또한 그 벤치 마크가 너무 안정적이지 않을 수 있습니다. 실제로 속도가 그토록 중요하다면 파서를 삽입하여 구현을 쉽게 변경하고 자체 벤치 마크 테스트를 수행 할 수 있도록 설계해야합니다.
사용자
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.