37

私は、json解析が情報をそのまま(CDATAであるかのように)取得し、それをシリアル化しようとしない方法を探しています。.netとjava(クライアントとサーバー)の両方を使用しているので、答えはJSON構造に関するものでなければなりません。この構造を実現する方法はありますか?

ありがとう。

4

4 に答える 4

22

JSONには同等のXMLCDATAはありません。ただし、base64などを使用して、メッセージを文字列リテラルにエンコードできます。詳細については、この質問を参照してください。

于 2013-02-18T12:16:32.077 に答える
0

これは、上記のラマンの提案を発展させたものです。

私はJSON形式が大好きですが、JSON形式で実行できるようにしたいこととできないことが2つあります。

  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!]]>"
}

このフォームでは、マーカーの間に任意のテキストを貼り付けることができます。ルーチンを再度呼び出すと、元の有効なJSONに戻ります。

これは、CDATA領域を使用してXMLとの間で変換するときにも機能させることができると思います。(次に試してみます!)

于 2020-08-25T09:00:48.457 に答える
0

YAMLファイルを作成してJSONに変換できます。例えば:

test.yaml

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))

これに似たその他のトリック:http yaml2json_pretty//github.com/frgomes/bash-scripts

于 2021-02-10T02:00:36.143 に答える
-8

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"
}
于 2013-02-18T12:14:52.067 に答える