2013-10-24 4 views
0

У меня есть JSON-файл, как это:Java - Джексон в файл

{ 
    "Product": 
    { 
     "ID": "08-17-96-71-D9-68", 

     "Licences": 
    { 
     "total": 40, 
     "used": 0, 
     "remain": 40 
     } 
    } 
} 

Я использовал Джексон, чтобы преобразовать его в объект Java, и я получаю все значения (до сих пор, так хорошо). Моя проблема заключается в том, что я хочу изменить эти значения и переписать файл JSON, но, когда я делаю это, результат таков:

"{\"Product\":{\"IaD\": \"08-17-96-71-D9-68\",\"Licences\":{\"total\": 40,\"used\": 1,\"remain\": 39}}}" 

Так что, когда я пытался читать его снова он дает мне ошибку ., потому что он не может прочитать первый и последний символ ("), а также он читает \ характер

Это мой код:

public class UsingJason { 
String theJsonString = ""; 
ObjectMapper mapper = new ObjectMapper(); 

public class Product{ 
    Licences lic; 

    public class Licences{ 
     int total; 
     int used; 
     int remain; 
    } 
} 


public void readJson(){ 
    if(new File("asset/testJson.json").exists()){ 
    theJsonString = "";  
    try { 
     BufferedReader in = new BufferedReader(new FileReader("asset/testJson.json")); 
     String line; 
     while ((line = in.readLine()) != null){ 
      theJsonString += line; 
     } 
     in.close(); 
    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 

    System.out.println("JSON String: "+ theJsonString); 
}else{ 
    System.out.println("NO FILE FOUND"); 
} 
JsonNode rootNode = null; 
try { 
    rootNode = mapper.readValue(theJsonString, JsonNode.class); 
} catch (JsonParseException e1) { 
    // TODO Auto-generated catch block 
    e1.printStackTrace(); 
} catch (JsonMappingException e1) { 
    // TODO Auto-generated catch block 
    e1.printStackTrace(); 
} catch (IOException e1) { 
    // TODO Auto-generated catch block 
    e1.printStackTrace(); 
} 
JsonNode totalNode = rootNode.get("Product").get("Licences").get("total"); 
JsonNode usedNode = rootNode.get("Product").get("Licences").get("used"); 
JsonNode remainNode = rootNode.get("Product").get("Licences").get("remain"); 

JsonNode idStringNode = rootNode.get("Product").get("ID"); 
// Parse it into a Java object. 
try { 
    int totalObject = mapper.readValue(totalNode, Integer.class); 
    System.out.println("INTEGER? HAS TO BE... 40: "+totalObject); 
    String idString = mapper.readValue(idStringNode, String.class); 
    System.out.println("String? Has to be 08-17-96-71-D9-68: "+idString + " True? " 
     + idString.equals("08-17-96-71-D9-68") ); 
    int usedObject = mapper.readValue(usedNode, int.class); 
    int remainObject = mapper.readValue(remainNode, int.class); 


    System.out.println("Going to rest 1"); 

    usedObject ++; 
    remainObject = totalObject - usedObject; 

    String toJackson = "{\"Product\":{\"I\\D\": \"08-17-96-71-D9-68\",\"Licences\":{\"total\": "+totalObject+",\"used\": "+usedObject+",\"remain\": "+remainObject+"}}}"; 



    System.out.println("String created: " +toJackson); 
      // THIS toJackson String returns the string without \ and without the " 
      // IT PRINT THIS: {"Product":{"ID": "08-17-96-71-D9-68","Licences":{"total": 40,"used": 1,"remain": 39}}} 
      // EXACTLY WHAT I WANT TO Write in the Json file but it writes the \ .. 

mapper.writeValue(new File("asset/testJson.json"), toJackson); 
} catch (JsonParseException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (JsonMappingException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

} 

может кто-нибудь сказать мне, что я делаю неправильно

+0

Это не как карта объекта в формате JSON. Используйте «ObjectMapper». –

+0

Можете прочесть, пожалуйста, более конкретно Lutz? mapper - ObjectMapper. – Alberto

ответ

2

В коде здесь:

mapper.writeValue(new File("asset/testJson.json"), toJackson); 

Вы сериализация не объект, а строки в файл. Полагаю, это причина, по которой она ускользает, как любая строка.

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

Что-то вроде этого:

// Initialize an object 
Product myProduct = new Product(); 
myProduct.lic = new Procuct.Licences(); 
myProduct.lic.total = totalObject; 
myProduct.lic.used = usedObject; 
myProduct.lic.remain = remainObject; 


// Serialize the object into JSON 
mapper.writeValue(new File("asset/testJson.json"), myProduct); 
+0

Я сделал это, и у меня есть ошибка, и я должен был поменять его на это: 'Продукт myProduct = new Product(); \t \t myProduct.lic = myProduct.new Лицензии(); \t \t myProduct.lic.total = totalObject; \t \t myProduct.lic.used = usedObject; \t \t myProduct.lic.remain = оставатьсяОбъект; \t \t myProduct.ID = idString; \t \t // Сериализовать объект в JSON mapper.writeValue (новый файл («asset/testJson.json»), myProduct); ' , но я получаю исключение: (следующий комментарий) – Alberto

+0

исключения: org.codehaus.jackson.map.JsonMappingException: Нет сериализатора найден для класса UsingJason $ продукта и никаких свойств, обнаруженных для создания BeanSerializer (чтобы избежать исключений, отключить SerializationConfig .Feature.FAIL_ON_EMPTY_BEANS)) Если я пишу перед mapper.writeValue \t \t 'mapper.configure (SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, ложные),' файл JSON я получаю пустой: {} – Alberto

+0

ОК, то Проблемой была видимость. Все должно быть общедоступным для сериализации. Большое спасибо DRCB! – Alberto

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