2

In Java project I used WebSocket to get subscription and I get many different responses from socket as JSONArray, the one which I need looks as below:

[
  68,
  "te",
  [
    80588348,
    1508768162000,
    0.01569882,
    5700.8
  ]
]

How should look JAVA object for this response? How can I convert it to this object?

[
  68, <- Integer
  "te", <- String
  [
    80588348, <- Long
    1508768162000, <- Long
    0.01569882, <- Double
    5700.8 <- Double
  ]
]

There is one problem that there are other responses like:

{"event":"subscribed","channel":"trades","chanId":68,"symbol":"tBTCUSD","pair":"BTCUSD"}

And when I try convert it by new JSONArray(response) it throws org.json.JSONException: A JSONArray text must start with '[' at 1 [character 2 line 1].

How to get and convert this fields which I need(the first response example) ?

I want get something like this:

public class Details{
   public Long id;
   public Long timestamp;
   public Double amount;
   public Double price;
}

public class Response{
   public Integer id;
   public String type;
   public Details details;
}
6
  • Are you using any frame works? Commented Oct 24, 2017 at 10:03
  • That isn't an object but just a list, i.e. in Java both the outer and the inner list would probably be either a List<Object> or an array Object[]. Commented Oct 24, 2017 at 10:04
  • I received String and I tried convert it by new JSONArray(responseString). It returned me JSONArray but I want to get java object which should contain Integer, String and second object inside with 4 fields. Commented Oct 24, 2017 at 10:06
  • 1
    If your response is fixed format, i recommend you to use objectmapper to transfer it to Java Object directly Commented Oct 24, 2017 at 10:27
  • 1
    @ACz Given a simple example for you, if you are having array of response, you can just read it as list and do some transformation. Commented Oct 24, 2017 at 10:32

2 Answers 2

2

The parser class as requested:

public class JsonParser {
    public static Response toJavaObject(String str) {
        String[] fields = str.split(",");
        Response res = new Response();
        res.setId(Integer.valueOf(fields[0].substring(1)));
        res.setType(fields[1].replaceAll("\"", ""));
        Details dtl = new Details();
        dtl.setId(Long.valueOf(fields[2].substring(1)));
        dtl.setTimestamp(Long.valueOf(fields[3]));
        dtl.setAmount(Double.valueOf(fields[4]));
        dtl.setPrice(Double.valueOf(fields[5].substring(0, fields[5].length() - 2)));
        res.setDetails(dtl);

        return res;
    }
}

class Details {
    public Long id;
    public Long timestamp;
    public Double amount;
    public Double price;

    public Long getId() {
        return id;
    }

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

    public Long getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(Long timestamp) {
        this.timestamp = timestamp;
    }

    public Double getAmount() {
        return amount;
    }

    public void setAmount(Double amount) {
        this.amount = amount;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }
}

class Response {
    public Integer id;
    public String type;
    public Details details;

    public Integer getId() {
        return id;
    }

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

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public Details getDetails() {
        return details;
    }

    public void setDetails(Details details) {
        this.details = details;
    }
}

To make use of this JsonParser,

for example in your code now:

public static void main(String args[]) {
    String str = "[68,\"te\",[80588348,1508768162000,0.01569882,5700.8]]";
    Response res = JsonParser.toJavaObject(str);
    // your logic below...
}
Sign up to request clarification or add additional context in comments.

7 Comments

Aww ok, so only manually way by setting fields is possible? No easiest way?
Come on bro, can you just create a JsonParser.java , copy the above stuff inside, and call it when needed
Last question, How to distinguish which object is coming? As I told I get two different responses from the same source [68,"te",[80588348,1508768162000,0.01569882,5700.8]] and {"event":"subscribed","channel":"trades","chanId":68,"symbol":"tBTCUSD","pair":"BTCUSD"} but I need only the first one
Added, please just copy make a java class, and import it and use it directly, it is not thread safe but whatever.
@ACz you can tell the different by reading the first char, if it is "[", then use, if it is "{", ignore
|
1

If your response is in fixed format,

example:

JSONString : {"color":"yellow","type":"renault"}

In Java, you can use the following code:

Car car = objectMapper.readValue(jsonString, Car.class);  

Where you have the Car class as:

public class Car {

    private String color;
    private String type;

    // standard getters setters
}

11 Comments

it is not a JSONArray, it is a standard JSONObject start with "[", which is an array struct
you are having an array structured json object, which is uncommon nowadays, i guess the best way is to implement a json parser yourself in this format
@ACz gson, jackson, json, all provided parsing for JSONObject, but not your kind of JSONObject...
If you are having input like that, it is not too difficult to write your own parser, give me like 3~5mins
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.