programing

JSON - XML CDATA와 동등한 것이 있습니까?

stoneblock 2023. 3. 20. 21:24

JSON - XML CDATA와 동등한 것이 있습니까?

json의 해석은 (CDATA인 것처럼) 정보를 그대로 받아들이고, 그것을 시리얼화하지 않는 방법을 찾고 있습니다..net과 java(클라이언트와 서버)를 모두 사용하고 있기 때문에 답은 JSON 구조에 관한 것입니다.이 구조를 실현하는 방법은 없습니까?

감사해요.

JSON에는 XML CDATA와 동등한 것이 없습니다.그러나 base64 같은 것을 사용하여 메시지를 문자열 리터럴로 인코딩할 수 있습니다.자세한 내용은 이 질문을 참조하십시오.

이것은 위의 라만 제안의 발전이다.

JSON 포맷이 마음에 드는데, 이 포맷으로 할 수 있는 것과 할 수 없는 것이 두 가지 있습니다.

  1. 텍스트 편집기를 사용하여 값에 일부 임의 텍스트 붙여넣기
  2. XML에 CDATA 섹션이 포함되어 있는 경우 XML과 JSON 간에 투과적으로 변환합니다.

이 실타래는 이 두 문제 모두에 관련이 있다.

JSON의 정식 정의가 깨지지 않는, 다음과 같은 방법으로 극복해 나갈 것을 제안합니다만, 이렇게 하면 문제가 축적되는 것은 아닐까요?

  1. 다음과 같이 JSON 호환 문자열 형식을 정의합니다.

    "<![CDATA[ (some text, escaped according to JSON rules) ]]>"

  2. 내가 좋아하는 프로그래밍 언어로 Unescape 루틴을 작성한다.<![CDATA[ and ]]>텍스트 에디터에 JSON 파일을 제공하기 전에 호출됩니다.

  3. 파일을 편집한 후 호출할 보완 루틴을 작성합니다. 이 루틴은 파일 편집 사이에 있는 모든 항목을 다시 이스케이프합니다.<![CDATA[ and ]]>JSON 규칙에 따라.

그런 다음 임의의 데이터를 파일에 붙여넣기 위해 필요한 것은 JSON 문자열 내의 임의의 데이터의 시작과 종료 신호를 입력하는 것입니다.<![CDATA[ before and ]]>그 다음에.

이것은 Python3의 텍스트 편집 전후에 호출하는 루틴입니다.lang-python3

escape_list = {
    8 : 'b',
    9 : 't',
    10: 'n',
    12: 'f',
    13: 'r',
    34: '"',
}   #List of ASCII character codes to escape, with their escaped equivalents

escape_char = "\\"  #this must be dealt with separately
unlikely_string = "ZzFfGgQqWw"

shebang = "#!/json/unesc\n"
start_cdata = "<![CDATA["
end_cdata = "]]>"

def escapejson(json_path):

    if (os.path.isfile(json_path)): #If it doesn't exist, we can't update it
        with open(json_path) as json_in:
            data_in = json_in.read()   #use read() 'cos we're goint to treat as txt
        #Set direction of escaping
        if (data_in[:len(shebang)] == shebang):   #data is unescaped, so re-escape
            data_in = data_in[len(shebang):] 
            unescape = False
            data_out = ""
        else:
            data_out = shebang
            unescape = True 

        while (data_in != ""):  #while there is still some input to deal with
            x = data_in.find(start_cdata)
            x1 = data_in.find(end_cdata)
            if (x > -1):    #something needs escaping
                if (x1 <0):
                    print ("Unterminated CDATA section!")
                    exit()
                elif (x1 < x):  #end before next start
                    print ("Extra CDATA terminator!")
                    exit()
                data_out += data_in[:x]
                data_in = data_in[x:]
                y = data_in.find(end_cdata) + len(end_cdata)
                to_fix = data_in[:y]    #this is what we're going to (un)escape
                if (to_fix[len(start_cdata):].find(start_cdata) >= 0):
                    print ("Nested CDATA sections not supported!")
                    exit()
                data_in = data_in[y:]   #chop data to fix from front of source
                if (unescape):
                    to_fix = to_fix.replace(escape_char + escape_char,unlikely_string)
                    for each_ascii in escape_list:
                        to_fix = to_fix.replace(escape_char + escape_list[each_ascii],chr(each_ascii))
                    to_fix = to_fix.replace(unlikely_string,escape_char)
                else:
                    to_fix = to_fix.replace(escape_char,escape_char + escape_char)
                    for each_ascii in escape_list:
                        to_fix = to_fix.replace(chr(each_ascii),escape_char + escape_list[each_ascii],)
                data_out += to_fix
            else:
                if (x1 > 0):
                    print ("Termination without start!")
                    exit()
                data_out += data_in
                data_in = ""

        #Save all to file of same name in same location
        try:
            with open(json_path, 'w') as outfile:
                outfile.write(data_out)
        except IOError as e:
            print("Writing "+ json_path + " failed "+ str(e))
    else:
        print("JSON file not found")

다음과 같은 JSON 데이터에 대한 조작

{
    "test": "<![CDATA[\n We can put all sorts of wicked things like\n \\slashes and\n \ttabs and \n \"double-quotes\"in here!]]>"
}

...는 다음을 생성합니다.

#!/json/unesc
{
    "test": "<![CDATA[
 We can put all sorts of wicked things like
 \slashes and
    tabs and 
 "double-quotes"in here!]]>"
}

이 양식에서는 마커 사이에 아무 텍스트나 붙여넣을 수 있습니다.다시 Rountine을 호출하면 원래 합법 JSON으로 돌아갑니다.

CDATA 지역에서의 XML로의 변환이나 XML로부터의 변환에도 대응할 수 있을 것 같습니다.(다음으로 시험해 보겠습니다!)

YAML 파일을 생성하여 JSON으로 변환할 수 있습니다.예를 들어 다음과 같습니다.

test.syslogl

storage:
  files:
  - filesystem: root
    path: /etc/sysconfig/network/ifcfg-eth0
    mode: 644
    overwrite: true
    contents:
      source: |
        data:,
        IPV6INIT=yes
        IPV6_AUTOCONF=yes

...그러면 실행한다.yaml2json_pretty(나중에 확인), 다음과 같습니다.

#!/bin/bash

cat test.yaml | yaml2json_pretty > test.json

...그 결과,

test.json

{
  "storage": {
    "files": [
      {
        "filesystem": "root",
        "path": "/etc/sysconfig/network/ifcfg-eth0",
        "mode": 644,
        "overwrite": true,
        "contents": {
          "source": "data:,\nIPV6INIT=yes\nIPV6_AUTOCONF=yes\n"
        }
      }
    ]
  }
}

다음은 yaml2json_pretty의 소스 코드입니다.

#!/usr/bin/env python3

import sys, yaml, json
print(json.dumps(yaml.load(sys.stdin.read(),Loader=yaml.FullLoader), sort_keys=False, indent=2))

과 더 많은 yaml2json_pretty주소: http://github.com/frgomes/bash-scripts

http://www.json.org/ 에서는 JSON 포맷에 대해 자세히 설명합니다.이에 따르면 JSON은 CDATA와 같은 값 유형을 지원하지 않습니다.

CDATA 구조를 실현하려면 커스텀로직을 적용하여 문자열 기반 값을 처리합니다(또한 .net 및 Java 구현 모두 동일한 방법으로 수행합니다).예.

{ 
  "type" : "CDATA",
  "value" : "Value that I will handle with my custom logic on java and .net side"
}

언급URL : https://stackoverflow.com/questions/14935866/json-is-there-any-xml-cdata-equivalent