Zijn strings met meerdere regels toegestaan in JSON?

Is het mogelijk om strings met meerdere regels in JSON te hebben?

Het is vooral bedoeld voor visueel comfort, dus ik denk dat ik de tekstomloop gewoon kan inschakelen in mijn editor, maar ik ben gewoon een beetje nieuwsgierig.

Ik ben enkele gegevensbestanden aan het schrijven in JSON-indeling en zou graag een aantal hele lange tekenreekswaarden over meerdere regels willen verdelen. Als ik de JSON-module van Python gebruik, krijg ik een heleboel fouten, of ik nu \of \nals een ontsnapping gebruik.


Antwoord 1, autoriteit 100%

JSONstaat geen echte regeleinden toe. Je moet alle regeleinden vervangen door \n.

bijvoorbeeld:

"first line
second line"

kan worden opgeslagen met:

"first line\nsecond line"

Opmerking:

voor Pythonmoet dit worden geschreven als:

"first line\\nsecond line"

waar \\is voor het ontsnappen van de backslash, anders behandelt python \nals
het controleteken “nieuwe regel”


Antwoord 2, autoriteit 46%

Ik heb dit moeten doen voor een klein Node.js-project en vond deze oplossing:

{
 "modify_head": [
  "<script type='text/javascript'>",
  "<!--",
  "  function drawSomeText(id) {",
  "  var pjs = Processing.getInstanceById(id);",
  "  var text = document.getElementById('inputtext').value;",
  "  pjs.drawText(text);}",
  "-->",
  "</script>"
 ],
 "modify_body": [
  "<input type='text' id='inputtext'></input>",
  "<button onclick=drawSomeText('ExampleCanvas')></button>"
 ],
}

Dit ziet er behoorlijk netjes uit, Appart daarvan moet ik overal dubbele aanhalingstekens gebruiken. Hoewel anders, zou ik misschien YAML kunnen gebruiken, maar dat heeft andere valkuilen en wordt niet native ondersteund. Eenmaal geparseerd, gebruik ik gewoon myData.modify_head.join('\n')of myData.modify_head.join(), afhankelijk van of ik na elk een lijnvakantie wil string of niet.


3, Autoriteit 44%

Helaas hebben veel van de antwoorden hier de vraag over het plaatsen van een nieuwlijnkarakter in de tekenreeksgegevens. De vraag is hoe de code er mooier uitziet door de tekenreekswaarde in meerdere regels code te splitsen. (En zelfs de antwoorden die dit herkennen geven “oplossingen” die aannemen dat er een is om de gegevensvertegenwoordiging te wijzigen, die in veel gevallen niet is.)

En het slechtere nieuws is, er is geen goed antwoord.

In veel programmeertalen, zelfs als ze niet expliciet de splitsingskoorden in de lijnen ondersteunen, kunt u nog steeds stringaconcatenatie gebruiken om het gewenste effect te krijgen; en zolang de compiler niet vreselijk is, is dit in orde.

Maar JSON is geen programmeertaal; Het is gewoon een gegevensvertegenwoordiging. Je kunt het niet vertellen aan aaneenschrijdende snaren. Evenmin is de (vrij kleine) grammatica elke mogelijkheid om een ​​tekenreeks op meerdere regels te vertegenwoordigen.

Kort het bedenken van een preprocessor van een soort (en ik, voor één, voel ik geen zin om mijn eigen taal op te lossen om dit probleem op te lossen), er is geen algemene oplossing voor dit probleem. Als u het gegevensformaat kunt wijzigen, kunt u een scala aan snaren vervangen. Anders is dit een van de vele manieren waarop JSON niet is ontworpen voor menselijke leesbaarheid.


Antwoord 4, autoriteit 13%

JSON staat geen afbrekende regels toe voor de leesbaarheid.

U kunt het beste een IDE gebruiken die line-wrap voor u zal zijn.


Antwoord 5, autoriteit 10%

Dit is een heel oude vraag, maar ik kwam deze tegen tijdens een zoekopdracht en ik denk dat ik de oorzaak van je probleem ken.

JSON staat geen “echte” nieuwe regels toe in zijn gegevens; het kan alleen aan newlines zijn ontsnapt. Zie het antwoordvan @YOU . Volgens de vraag lijkt het erop dat je op twee manieren hebt geprobeerd om regelafbrekingen in Python te omzeilen: door het regelvervolgteken ("\") te gebruiken of door "\n"als een ontsnapping.

Maar onthoud: als je een string in python gebruikt, worden speciale escapetekens ("\t", "\n") vertaald in ECHTE controle karakters! De "\n"wordt vervangen door het ASCII-besturingsteken dat een teken voor een nieuwe regel vertegenwoordigt, wat precies het teken is dat illegaal is in JSON. (Wat betreft het vervolgteken van de regel, het haalt gewoon de nieuwe regel eruit.)

Dus wat u moet doen, is voorkomen dat Python tekens ontsnapt. U kunt dit doen door een onbewerkte tekenreeks te gebruiken (zet rvoor de tekenreeks, zoals in r"abc\ndef", of door een extra schuine streep voor de nieuwe regel ("abc\\ndef").

Beide van bovenstaande zullen, in plaats van "\n"te vervangen door het echte nieuwe regel ASCII-besturingsteken, "\n"achterlaten als twee letterlijke tekens, die dan kan JSON het interpreteren als een ontsnapping voor een nieuwe regel.


Antwoord 6, autoriteit 4%

Schrijf de eigenschapswaarde als een reeks tekenreeksen. Zoals hier gegeven voorbeeld https://gun.io/blog/multi-line-strings-in- json/. Dit zal helpen.

We kunnen altijd een reeks strings gebruiken voor strings met meerdere regels, zoals de volgende.

{
    "singleLine": "Some singleline String",
    "multiline": ["Line one", "line Two", "Line Three"]
} 

En we kunnen de array gemakkelijk herhalen om inhoud op meerdere regels weer te geven.


Antwoord 7

Hoewel niet standaard, ontdekte ik dat sommige JSON-bibliotheken opties hebben om strings met meerdere regels te ondersteunen. Ik zeg dit met de waarschuwing dat dit uw interoperabiliteit zal schaden.

In het specifieke scenario dat ik tegenkwam, moest ik echter een configuratiebestand maken dat alleen door één systeem werd gebruikt en dat leesbaar en beheersbaar was voor mensen. En koos uiteindelijk voor deze oplossing.

Zo werkt dit op Java met Jackson:

JsonMapper mapper = JsonMapper.builder()
   .enable(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS)
   .build()

Antwoord 8

Probeer dit, het verwerkt ook het enkele aanhalingsteken dat niet kan worden geparseerd door de JSON.parse()-methode en ondersteunt ook de UTF-8-tekencode.

   parseJSON = function() {
        var data = {};
        var reader = new FileReader();
        reader.onload = function() {
            try {
                data = JSON.parse(reader.result.replace(/'/g, "\""));
            } catch (ex) {
                console.log('error' + ex);
            }
        };
        reader.readAsText(fileSelector_test[0].files[0], 'utf-8');
}

Other episodes