2015-03-28 6 views
11

मेरे वेब एप्लिकेशन में मैं mybatis का उपयोग कर HTML तालिका में डेटा प्रदर्शित करने में सफल हूं। अब मैं एक जेसन फ़ाइल में MySQL तालिका के रिकॉर्ड्स को सहेजना चाहता हूं और उपयोगकर्ताओं की एक सरणी बनाना चाहता हूं, मैंने जीसन का इस्तेमाल किया, समस्या यह है कि फ़ाइल में केवल एक रिकॉर्ड सहेजा गया है। धन्यवाद। file.json में यहाँ परिणाम
:एक जेसन फ़ाइल में जीएसएन के साथ डेटा कैसे सहेजना है?

{"data": 
[ 
{"id":2,"Name":"Mike"} 
] 
} 

servlet.java

SqlSession session = MyBatisSqlSessionFactory.getSession(); 
List<User> users = session.selectList("dao.UserDao.findAll"); 
for (User u : users) { 
    Gson gson = new Gson(); 
    try { 
     JsonWriter writer = new JsonWriter(new FileWriter("C:\\file.json")); 
     writer.beginObject(); 
     writer.name("data"); 
     writer.beginArray(); 
     writer.beginObject(); 
     writer.name("id").value(t.getId()); 
     writer.name("name").value(t.getNom()); 
     writer.endObject(); 
     writer.endArray(); 
     writer.endObject(); 
     writer.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

session.close(); 
+0

क्योंकि आप प्रत्येक लूप पुनरावृत्ति में एक ही फ़ाइल में लिख रहे हैं। आपको फ़ाइल में _list_ लिखना होगा, प्रत्येक तत्व नहीं। –

+0

यदि मैं आपको समझता हूं, तो मैं लाइन "जेसनवाइटर लेखक = नया जेसनवाइटर (नया फ़ाइलवाइटर (" सी: \\ file.json ")) को स्थानांतरित करता हूं;" के लिए लाइन से पहले, लेकिन एक ही परिणाम –

+0

तो आप समझ में नहीं आता है। आपको 'सूची' लिखनी होगी! जीसन इसे जेएसओएन को सिर्फ ठीक से क्रमबद्ध करेगा। –

उत्तर

23

आप एक ही फाइल C:\\file.json तो बस पाश बचाया के अंतिम चरण में सभी उपयोगकर्ताओं लिखें।

आप json में वस्तु List<User> बदलने और यह एक बार (कोई जरूरत पाश) लिख सकते हैं

उदाहरण:

try (Writer writer = new FileWriter("Output.json")) { 
    Gson gson = new GsonBuilder().create(); 
    gson.toJson(users, writer); 
} 
+2

के साथ पहला उदाहरण है, उत्तर के लिए धन्यवाद, मेरे पास जेसन फ़ाइल में सभी उपयोगकर्ता थे, लेकिन तारों के साथ बैकस्लैश क्यों। मुझे बैकस्लैश की आवश्यकता नहीं है।"[ {\" id \ ": 1, \" name \ ": \" नैन्सी \ "}, {\" id \ ": 2, \" detail \ ": \" माइक \ "} ]" –

+0

यदि आप स्ट्रिंग को बदले बिना पूर्ण ऑब्जेक्ट के रूप में सहेजते हैं तो आप इसे आसानी से अपने ऑब्जेक्ट में परिवर्तित कर सकते हैं, लेकिन यह आपके मिशन पर निर्भर करता है –

+0

क्या आपके पास लूपिंग के साथ मेरे पहले सुझाव के बारे में कोई समाधान है? –

1

मैं पहले outputStream.writeObject और डिफ़ॉल्ट लेखक/रीडर के साथ Serializable उपयोग कर रहा था ऑब्जेक्ट डेटा को सहेजने के लिए। कोड स्थिरता के साथ समस्याओं की वजह से मैं कुछ और के बाद किया गया है। यह परिणाम है। वह BufferedWriter अनिवार्य है, अन्यथा गति लिखने 8 बार ड्रॉप। ध्यान दें कि यूटीएफ -8 घोषणा जो default encoding of Json है। सुनिश्चित नहीं है कि यह घोषित नहीं है कि यह सुरक्षित है या नहीं।

उदाहरण:

private void saveJson(Object object, Type type, String directory, String fileName) { 

    File file = new File(getApplicationContext().getDir(directory, Context.MODE_PRIVATE), 
      fileName); 
    OutputStream outputStream = null; 
    Gson gson = new GsonBuilder().enableComplexMapKeySerialization().setPrettyPrinting() 
      .create(); 
    try { 
     outputStream = new FileOutputStream(file); 
     BufferedWriter bufferedWriter; 
     if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
      bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, 
        StandardCharsets.UTF_8)); 
     } else { 
      bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8")); 
     } 

     gson.toJson(object, type, bufferedWriter); 
     bufferedWriter.close(); 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     if (DEBUG) Log.e(saveJson, "saveUserData, FileNotFoundException e: '" + e + "'"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     if (DEBUG) Log.e(saveJson, "saveUserData, IOException e: '" + e + "'"); 
    } finally { 
     if (outputStream != null) { 
      try { 
       outputStream.flush(); 
       outputStream.close(); 
      } catch (IOException e) { 
       if (DEBUG) Log.e(saveJson, "saveUserData, finally, e: '" + e + "'"); 
      } 
     } 
    } 

} 


private Object loadJson(Type type, String directory, String fileName) { 
    Object jsonData = null; 

    File file = new File(getApplicationContext().getDir(directory, Context.MODE_PRIVATE), 
      fileName); 
    InputStream inputStream = null; 
    Gson gson = new GsonBuilder().enableComplexMapKeySerialization().setPrettyPrinting() 
      .create(); 
    try { 
     inputStream = new FileInputStream(file); 
     InputStreamReader streamReader; 
     if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
      streamReader = new InputStreamReader(inputStream, 
        StandardCharsets.UTF_8); 
     } else { 
      streamReader = new InputStreamReader(inputStream, "UTF-8"); 
     } 

     jsonData = gson.fromJson(streamReader, type); 
     streamReader.close(); 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     if (DEBUG) Log.e(TAG, "loadJson, FileNotFoundException e: '" + e + "'"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     if (DEBUG) Log.e(TAG, "loadJson, IOException e: '" + e + "'"); 
    } finally { 
     if (inputStream != null) { 
      try { 
       inputStream.close(); 
      } catch (IOException e) { 
       if (DEBUG) Log.e(TAG, "loadJson, finally, e: '" + e + "'"); 
      } 
     } 
    } 
    return jsonData; 
} 

जहां उदाहरण के लिए प्रकार:

SqlSession session = MyBatisSqlSessionFactory.getSession(); 
List<User> users = session.selectList("dao.UserDao.findAll"); 
try { 
    JsonWriter writer = new JsonWriter(new FileWriter("C:\\file.json")); 
    writer.beginObject(); 
    writer.name("data"); 
    writer.beginArray(); 
    for (User u : users) { 
     writer.beginObject(); 
     writer.name("id").value(t.getId()); 
     writer.name("name").value(t.getNom()); 
     writer.endObject(); 
    } 
    writer.endArray(); 
    writer.endObject(); 
    writer.close(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

हालांकि, यदि आपके उपयोगकर्ता वर्ग इस तरह दिखता में:

Type type = new TypeToken<Map<String, Object>>() { }.getType(); 
0

त्वरित सुधार अपने कोड में :

public class User { 
    String id; 
    String name; 
} 

फिर आपको एडाप्टर को कोड करने की आवश्यकता नहीं है क्योंकि जीसन स्वचालित रूप से उस वर्ग के लिए जेएसओएन कोड उत्पन्न करने में सक्षम है जिसमें केवल प्राइमेटिव (इन्ट्स, स्ट्रिंग्स इत्यादि) हैं। तो आपका कोड @ रॉय-शमुली के रूप में दिखाई देगा, लेकिन केवल तभी जब आप डेटा को छोड़ दें और केवल सरणी को रखें क्योंकि सूची को एडाप्टर के बिना पूरी तरह से जेनरेट किया जा सकता है। उत्पन्न जेएसओएन कोड इस तरह दिखेगा:

[ 
    {"id":1, "name": "Mike"}, 
    {"id":2, "name": "Lucy"} 
] 

आशा है कि यह शुरुआती लोगों की सहायता करे।

संबंधित मुद्दे