2017-02-22 14 views
2

У меня есть веб-сервис на Java с Джерси для создания и редактирования цен на рынке. Для этого я отправляю объект JSON, содержащий информацию о рынке, включая другой объект JSON для цен.JSON - Ошибка при установке строки JSON внутри объекта JSON

Например, это JSON я отправляю через Почтальон:

{ 
    "name": "Market 01", 
    "address": "Market 01 street", 
    "prices": "{\"watermelon\": \"5.40\", \"melon\": \"2.55\"}" 
} 

На стороне веб-сервера, я пытаюсь создать список цен, используя GSON, но я не могу получить это работать. Моя цель здесь - проверить разницу между новыми ценами и текущими ценами. Ниже есть мой POJO Price.java, что я пытаюсь сделать на контроллере для редактирования и Exception я адресности на Почтальон:

POJO - Price.java

public class Price { 
    private String nome; 
    private Double preco; 
    //Getters and setters also 
} 

MarketController .java

Collection<Price> prices = gson.fromJson(json, new TypeToken<List<Price>>(){}.getType()); 

Исключение возникает на MarketController.java:

java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $ 

EDIT: Решение, которое работало для меня на основе @ A2h ответа:

POJO класса - Price.java

public class Price { 
    private String name; 
    private Double price; 

    ... 

    @Override 
    public String toString() { 
     return "{\"name\":\"" + name + "\", \"price\":" + price + "}"; 
    } 
} 

POJO класс - Market.java

public class Market{ 
    ... 
    //Include as a List<Price> 
    private List<Price> prices; 
    ... 
} 

MarketController.java

// When going from List<Price> to JSON String 
String prices = gson.toJson(market.getPrices()); 
// When going from JSON String to List<Price> 
List<Price> prices = gson.fromJson(jsonString, new TypeToken<List<Price>>(){}.getType()); 

Этот код хорошо округлен для этой ситуации, где вам необходимо перекрыть rm из списка в строку JSON и наоборот.

ответ

2

Ваш POJO подразумевает, что у вас должен быть массив цен в вашем объекте JSON.

Полный рабочий пример.

package test; 

import java.util.List; 

import com.google.gson.Gson; 

public class TESTTEST { 

    public class MarketInfo { 
     String name; 
     String address; 
     List<Price> prices; 

     public String getName() { 
      return name; 
     } 

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

     public String getAddress() { 
      return address; 
     } 

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

     public List<Price> getPrices() { 
      return prices; 
     } 

     public void setPrices(List<Price> prices) { 
      this.prices = prices; 
     } 
    } 

    public class Price { 
     String nome; 
     Double preco; 

     public String getNome() { 
      return nome; 
     } 

     public void setNome(String nome) { 
      this.nome = nome; 
     } 

     public Double getPreco() { 
      return preco; 
     } 

     public void setPreco(Double preco) { 
      this.preco = preco; 
     } 

     @Override 
     public String toString() { 
      return "{\"nome\":\"" + nome + "\", \"preco\":" + preco + "}"; 
     } 
    } 

    public static void main(String[] args) { 
     Gson gson = new Gson(); 
     String jsonString = "{\"name\": \"Market 01\",\"address\": \"Market 01 street\"," 
      + "\"prices\": [{\"nome\":\"watermelon\",\"preco\":\"5.40\"}, {\"nome\":\"melon\",\"preco\": \"2.55\"}]}"; 
     MarketInfo res = gson.fromJson(jsonString, MarketInfo.class); 
     System.out.println(res.getPrices()); 
    } 
} 
+0

Как я могу заставить это работать с Hibernate? Я имею в виду, моя цель - хранить цены в виде строки JSON на БД. – Minoru

+0

Ну, это другой вопрос, но я предполагаю, что у вас есть именованный запрос, к которому вы можете передать строку JSON и сохранить его в поле вашего выбора таблицы.Затем, всякий раз, когда вы читаете эту строку JSON, вы можете построить «объект», как описано выше. – ahoxha

+0

Я сделал то, что вы ответили, и теперь я могу получить JSON и сохранить его в БД. Проблема заключается в том, что я пытаюсь воссоздать список для сравнения с новым. Можно ли сравнивать, не пересоздавая список, или мне действительно нужно сделать этот шаг? – Minoru

2

Это потому, что List будет представлен массивом JSON, а не объектом, который вы предоставляете. Вы можете попытаться десериализовать карту (или отправить массив).

+0

Можете ли вы показать пример, пожалуйста? То, что вы говорите, выглядит примерно так: 'Collection prices = = gson.fromJson (json, new TypeToken >() {}. GetType());'? – Minoru

+0

Да, вроде. Это даст вам еще одну ошибку, потому что результат не соответствует совместимости с 'Collection '. – Henry

+0

Можете ли вы изменить строку ввода? Например: '{" nome ":" melon "," preco ": 5.40}' – ahoxha

Смежные вопросы