2013-03-22 51 views
6

Tôi có câu hỏi liên quan đến ứng dụng web Tôi đang xây dựng nơi tôi có dịch vụ REST nhận chuỗi json.Phân tích đối tượng json thành chuỗi

Các Json chuỗi là một cái gì đó như:

{ 
    "string" : "value", 
    "string" : "value", 
    "object" : { 
       "string" : "value", 
       "string" : "value", 
       .... 
       } 
} 

Tôi đang sử dụng resteasy để phân tích chuỗi json trong đó sử dụng jackson bên dưới. Tôi có một lớp chú thích jaxb và tôi muốn phân tích cú pháp "đối tượng" hoàn toàn thành một biến String. Lý do tôi muốn làm điều này là để có thể phân tích cú pháp json sau đó bằng cách sử dụng trình phân tích cú pháp chính xác (nó phụ thuộc vào ứng dụng gửi yêu cầu để không thể biết trước).

jaxb My chú thích lớp trông như thế này:

@XmlRootElement 
@XmlAccessorType(XmlAccessType.PROPERTY) 
public class Test{ 

@XmlElement(type = String.class) 
private String object; 

//getter and setter 
... 
} 

Khi tôi thực hiện cuộc gọi còn lại và để jackson phân tích mã này tôi nhận được một lỗi

Can not deserialize instance of java.lang.String out of START_OBJECT token 

. Vì vậy, thực sự tôi đang cố gắng phân tích một đoạn của một chuỗi json, đó là một đối tượng json, thành một String. Tôi dường như không thể tìm thấy ai đó có vấn đề tương tự.

Cảm ơn trước vì bất kỳ phản hồi nào.

+4

Phải là một chuỗi? Vì bạn đang sử dụng Jackson, tôi khuyên bạn nên lưu trữ đối tượng của mình dưới dạng [JsonNode] (http://fasterxml.github.com/jackson-databind/javadoc/2.1.0/com/fasterxml/jackson/databind/JsonNode.html). Điều này sẽ được deserialized tốt và bạn có thể phân tích cú pháp nó sau đó với trình phân tích cú pháp chính xác. – nutlike

+0

Theo nhà phân tích của tôi, nó nên là :). Tôi sẽ thử nó, nếu nó hoạt động, tôi sẽ thuyết phục anh ta. – KwintenP

Trả lời

0
java.lang.String out of START_OBJECT token 

này có nghĩa là dự kiến ​​nhân vật sau khi "object" là dấu ngoặc kép ", nhưng không dấu ngoặc {.

mong đợi json

"object" : "my object" 

json thực tế

"object" : { ... 

=======
Nếu bạn muốn phân tích json như trong ví dụ của bạn, sau đó thay đổi của bạn lớp học. Ví dụ.

@XmlRootElement 
@XmlAccessorType(XmlAccessType.PROPERTY) 
public class Test{ 

    @XmlElement 
    private InnerTest object; 

    //getter and setter 
... 
} 

@XmlAccessorType(XmlAccessType.PROPERTY) 
public class InnerTest{ 

    @XmlElement 
    private String string; 

    //getter and setter 
... 
} 
1

Nếu tôi hiểu câu hỏi này bạn chỉ muốn một nhà kỹ xảo, chuyển đổi đối tượng Java thành chuỗi JSON và cách khác.

Tôi cũng cần điều này, trong khi tôi đang sử dụng giao tiếp WebSocket Client-Server trong đó một chuỗi JSON đã được truyền đi.

Đối với điều này tôi đã sử dụng GSON (xem GSON). Ở đó bạn có khả năng tạo một JSON-String hoàn chỉnh. Dưới đây một số ví dụ:

// Converts a object into a JSON-String 
public String convertMyClassObjectToJsonFormat() { 
    MyClass myObject = new MyClass(); 
    Gson gson = new Gson(); 

    return gson.toJson(myObject); 
} 

//Converts a JSON-String into a Java-Class-Object 
public MyClass convertJsonToMyClassObject(
      CharBuffer jsonMessage) { 
    Gson gson = new Gson(); 

    return gson.fromJson(jsonMessage.toString(), 
       MyClass.class); 
} 

gì bạn cần là, mà bạn của bạn Class-Attributes-setter và JSON-Attribute-tên là tương đương. Ví dụ.

{ 
    "info":[ 
     { 
     "name": "Adam", 
     "address": "Park Street" 
     } 
    ] 
} 

Lớp của bạn sẽ trông như thế này:

public class Info{ 
private String name; 
private String address; 

public void setName(String name){ 
    this.name = name; 
} 
public void setAddress(String address){ 
    this.address = address; 
} 
} 
0

bạn cũng có thể làm điều gì đó như thế này;

public class LeaderboardView 
{ 
    @NotEmpty 
    @JsonProperty 
    private String appId; 

    @NotEmpty 
    @JsonProperty 
    private String userId; 

    @JsonProperty 
    private String name = ""; 

    @JsonProperty 
    private String imagePath = ""; 

    @NotEmpty 
    @JsonIgnore 
    private String rank = ""; 

    @NotEmpty 
    @JsonProperty 
    private String score; 

    public LeaderboardView() 
    { 
     // Jackson deserialization 
    } 

}

1

@KwintenP Hãy thử sử dụng json smart library.

Bạn có thể sau đó chỉ cần lấy đối tượng JSON đầu tiên sử dụng:

JSONObject test = (JSONObject) JSONValue.parse(yourJSONObject); 
String TestString = test.toString(); 

Hơn thế nữa, bạn có thể lấy một đối tượng cụ thể bên trong một đối tượng JSON nó có thể là một đối tượng, một mảng và chuyển nó sang một String hoặc thao tác theo cách bạn muốn.

Các vấn đề liên quan