私は、json解析が情報をそのまま(CDATAであるかのように)取得し、それをシリアル化しようとしない方法を探しています。.netとjava(クライアントとサーバー)の両方を使用しているので、答えはJSON構造に関するものでなければなりません。この構造を実現する方法はありますか?
ありがとう。
JSONには同等のXMLCDATAはありません。ただし、base64などを使用して、メッセージを文字列リテラルにエンコードできます。詳細については、この質問を参照してください。
これは、上記のラマンの提案を発展させたものです。
私はJSON形式が大好きですが、JSON形式で実行できるようにしたいこととできないことが2つあります。
このスレッドは、これら両方の問題に密接に関係しています。
私はこれを次の方法で克服することを提案していますが、これはJSONの正式な定義を破ることはありませんが、これを行うと問題が発生するのではないかと思います。
JSON互換の文字列形式を次のように定義します。
"<![CDATA[ (some text, escaped according to JSON rules) ]]>"
私の好きなプログラミング言語でUnescapeルーチンを作成します。これは、の間のすべてをエスケープ解除し<![CDATA[ and ]]>
ます。これは、JSONファイルをテキストエディターに提供する前に呼び出されます。
<![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との間で変換するときにも機能させることができると思います。(次に試してみます!)
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
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"
}