2013-05-22 4 views
74

हो सकता है मैं एक JSON फ़ाइल लिख रहा हूं जिसे जावा प्रोग्राम द्वारा पढ़ा जाएगा। खंड निम्नानुसार है ...क्या एक JSON मान में एक मल्टीलाइन स्ट्रिंग

{ 
    "testCases" : 
    { 
    "case.1" : 
    { 
     "scenario" : "this the case 1.", 
     "result" : "this is a very long line which is not easily readble. 
        so i would like to write it in multiple lines. 
        but, i do NOT require any new lines in the output. 
        I need to split the string value in this input file only. 
        such that I don't require to slide the horizontal scroll again and again while verifying the correctness of the statements. 
        the prev line, I have shown, without splitting just to give a feel of my problem" 
    } 
    } 
} 
+0

{ "testCases" : { "case.1" : { "scenario" : "this the case 1.", "result" : "this is a very long line which is not easily readble. so i would like to write it in multiple lines. but, i do NOT require any new lines in the output. I need to split the string value in this input file only. such that I don't require to slide the horizontal scroll again and again while verifying the correctness of the statements. the prev line, I have shown, without splitting just to give a feel of my problem" } } } } [JSON में बहुपंक्ति तार] (http के – user2409155

+2

संभव डुप्लिकेट का उपयोग कर सकते में: // stackoverflow .com/प्रश्न/2392766/मल्टीलाइन-स्ट्रिंग्स-इन-जेसन) –

+9

मुझे लगता है कि यह सीरियलाइज्ड JSON फ़ाइल की पठनीयता और लोड किए गए डेटा में लाइनब्रेक्स के बारे में _not_ के बारे में अधिक नहीं है (इस प्रकार, JSON में [मल्टीलाइन स्ट्रिंग्स का डुप्लिकेट नहीं) http://stackoverflow.com/q/2392766/703040))। इसके बारे में सोचें कि JSON को कॉन्फ़िगरेशन फ़ाइल के रूप में उपयोग करने की तरह, जहां आपके पास लंबी स्ट्रिंग है और, पठनीयता के लिए, किसी पाठ संपादक के माध्यम से इसे संपादित करने के मामले में स्ट्रिंग को हार्ड-लपेटना उपयोगी होता है। – zashu

उत्तर

41

the specification देखें!

  • किसी भी-यूनिकोड-चरित्र-except- " -या- \ -या नियंत्रण-चरित्र
  • \"
  • \\
  • : JSON व्याकरण के चार उत्पादन निम्न मान ले जा सकते हैं
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \uचार हेक्स अंक

Newlines रहे हैं "नियंत्रण वर्ण" हां, नहीं, तुम एक शाब्दिक न्यू लाइन के भीतर नहीं हो सकता है आपकी स्ट्रिंग हालांकि आप \n और \r के किसी भी संयोजन का उपयोग करके इसे एन्कोड कर सकते हैं।

JSONLint उपकरण पुष्टि करता है कि आपके JSON अमान्य है।


अद्यतन: और अगर आप वास्तव में डेटा में नई-पंक्तियों को शामिल किए बिना आपके JSON वाक्य रचना के अंदर नई पंक्तियां लिखना चाहते हैं, तो आप भाग्य से बाहर भी दोगुना कर रहे हैं। जबकि JSON एक डिग्री के लिए मानव-अनुकूल होने का इरादा है, यह अभी भी डेटा है और आप उस डेटा पर मनमाने ढंग से स्वरूपण लागू करने का प्रयास कर रहे हैं। जेएसओएन के बारे में यह बिल्कुल नहीं है।

3

जैसा कि मैं समझ सकता हूं कि प्रश्न json का उपयोग कर नियंत्रण प्रतीकों के साथ एक स्ट्रिंग को पास करने के बारे में नहीं है, लेकिन फ़ाइल में जेसन को स्टोर और पुनर्स्थापित कैसे करें जहां आप संपादक नियंत्रण प्रतीकों के साथ एक स्ट्रिंग को विभाजित कर सकते हैं।

आप एक फ़ाइल में बहु स्ट्रिंग संग्रहीत करना चाहते हैं, तो आपके फ़ाइल वैध json वस्तु संग्रहीत नहीं करेगा। लेकिन अगर आप अपने प्रोग्राम में केवल json फ़ाइलों का उपयोग करते हैं, तो आप डेटा को वांछित रूप से स्टोर कर सकते हैं और जब भी आप इसे अपने प्रोग्राम में लोड करते हैं तो मैन्युअल रूप से फ़ाइल से सभी न्यूलाइन हटा सकते हैं और फिर जेसन पार्सर को पास कर सकते हैं।

या, वैकल्पिक रूप से, जो बेहतर होगा, आप अपने json डेटा स्रोत फ़ाइलें जहां वैध json फ़ाइल में आपका कार्यक्रम का उपयोग करेगा करने के लिए एक स्टिंग संपादित के रूप में आप चाहते हैं और फिर हटाने कुछ उपयोगिता के साथ सभी नई लाइनों कर सकते हैं।

23

मैं अपने सटीक आवश्यकता के बारे में सुनिश्चित नहीं कर रहा हूँ, लेकिन एक संभव समाधान में सुधार के लिए 'पठनीयता' एक सरणी के रूप में यह स्टोर करने के लिए है।

{ 
    "testCases" : 
    { 
    "case.1" : 
    { 
     "scenario" : "this the case 1.", 
     "result" : ["this is a very long line which is not easily readble.", 
        "so i would like to write it in multiple lines.", 
        "but, i do NOT require any new lines in the output."] 
    } 
    } 
} 

} 

फिर से वापस में शामिल होने के लिए जब भी क्योंकि एकल वर्ण के लिए एक से अधिक उत्पादन charactes हो सकता है

result.join(" ") 
+4

हालांकि यह असामान्य है। यह एक अमूर्त रिसाव है। मैं अनिवार्य रूप से टूटा हुआ इस तरह से निर्दिष्ट डेटा प्रारूप पर विचार करता हूं। –

+3

मैं एक एपीआई या JSON दस्तावेज़ को स्ट्रिंग पठनीयता बढ़ाने के लिए इस तरह से डिजाइन करने की कल्पना नहीं कर सकता (केवल मुझे लगता है कि डीबगिंग कारणों के लिए): | .... –

+0

विवरण के लिए उपयोगी हालांकि, धन्यवाद! – Rob

0

इस लेखक के रूप में कार्यान्वित किया जाता है के साथ की आवश्यकता है। मैं इसे पाठक के रूप में कल्पना नहीं कर सका। काम के लिए काफी भारी लेकिन काफी विस्तार योग्य।

String multilineJson = "{\n" + 
     "prop1 = \"value1\",\n" + 
     "prop2 = \"multi line\n" + 
     "value2\"\n" + 
     "}\n"; 
String multilineJsonExpected = "{\n" + 
     "prop1 = \"value1\",\n" + 
     "prop2 = \"multi line\\nvalue2\"\n" + 
     "}\n"; 

StringWriter sw = new StringWriter(); 
JsonProcessor jsonProcessor = new JsonProcessor(sw); 
jsonProcessor.write(multilineJson); 

assertEquals(multilineJsonExpected, sw.toString()); 

कार्यान्वयन

public class JsonProcessor extends FilterWriter { 

    private char[] curr; 
    private int currIdx; 

    private boolean doubleQuoted; 

    public JsonProcessor(Writer out) { 
     super(out); 
    } 

    @Override 
    public void write(String str) throws IOException { 
     char[] arr = str.toCharArray(); 
     write(arr, 0, arr.length); 
    } 

    @Override 
    synchronized public void write(char[] cbuf, int off, int len) throws IOException { 
     curr = Arrays.copyOfRange(cbuf, off, len - off); 
     for (currIdx = 0; currIdx < curr.length; currIdx++) { 
      processChar(); 
     } 
    } 

    private void processChar() throws IOException { 
     switch (currentChar()) { 
      case '"': 
       processDoubleQuotesSymbol(); 
       break; 
      case '\n': 
      case '\r': 
       processLineBreakSymbol(); 
       break; 
      default: 
       write(currentChar()); 
       break; 
     } 
    } 

    private void processDoubleQuotesSymbol() throws IOException { 
     doubleQuoted = !doubleQuoted; 
     write('"'); 
    } 

    private void processLineBreakSymbol() throws IOException { 
     if (doubleQuoted) { 
      write('\\'); 
      write('n'); 
      if (lookAhead() == '\n' || lookAhead() == '\r') { 
       currIdx++; 
      } 
     } else { 
      write(currentChar()); 
     } 
    } 

    private char currentChar() { 
     return curr[currIdx]; 
    } 

    private char lookAhead() { 
     if (currIdx >= curr.length) { 
      return 0; 
     } 
     return curr[currIdx + 1]; 
    } 
} 
1

नहीं बहुत अच्छा समाधान है, लेकिन आप hjson उपकरण की कोशिश कर सकते हैं। Link। यह आपको संपादक में बहु-पंक्तिबद्ध टेक्स्ट लिखने की अनुमति देता है और फिर इसे उचित मान्य JSON प्रारूप में परिवर्तित करता है। नोट: यह नई लाइनों के लिए '\ N' अक्षर लेता है, लेकिन आप बस "सभी .. बदलें" समारोह के साथ किसी भी पाठ संपादक में उन्हें हटा सकते हैं।

पीएस सवाल पर एक टिप्पणी होनी चाहिए, लेकिन पर्याप्त रेपो नहीं है, क्षमा करें।

1

मेरा मानना ​​है कि यह प्रयोग कर रहे हैं क्या json दुभाषिया पर निर्भर करता है ... सादे जावास्क्रिप्ट आप लाइन टर्मिनेटर्स

{ 
    "testCases" : 
    { 
    "case.1" : 
    { 
     "scenario" : "this the case 1.", 
     "result" : "this is a very long line which is not easily readble. \ 
        so i would like to write it in multiple lines. \ 
        but, i do NOT require any new lines in the output." 
    } 
    } 
} 
+0

यह सही है, लेकिन इंडेंटेशन रिक्त स्थान आउटपुट होगा: 'a \ c' =>' c'। –

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