web-dev-qa-db-ja.com

エスケープされたJSONを含む文字列を有効なJSONに安全に変換する方法は?

次のようにJSON応答を返すサードパーティAPIと通信しています。

"{\"SomeResponse\":{\"FIrstAttribute\":8,\"SecondAttribute\":\"On\",\"ThirdAttribute\":{\"Id\":2,\"FirstName\":\"Okkie\",\"Name\":\"Bokkie\",\"Street\":\"\",\"StreetNumber\":null,\"PostCode\":\"\",\"City\":\"\",\"Country\":\"}}}"

JSONのようなものですが、文字列として。最初と最後の二重引用符、そしてもちろんすべてのエスケープスラッシュに注意してください。

現在、私はこれを文字列で解決しています。バックスラッシュと最初と最後の引用符を置き換える。その後、私はそれを解析することができます。

mystring.Replace("\\", "");

しかし、属性の1つが実際に値としてバックスラッシュを持っている場合はどうなりますか?例えば:

\"SecondAttribute\":\"My Super Back Slash: \\ . That was it.\"

その場合、値にあるはずのバックスラッシュを誤って削除してしまいます。

このJSON文字列を適切に解析する方法について誰かが明るいアイデアを持っていますか?

16
Gonzalioz

これは基本的にJSONでエンコードされていますas JSON文字列-コメントのとおり、文字列の末尾をごくわずかに修正した後です。最初にJToken.Parseを使用して効果的にエスケープを解除し、次に結果を解析して、Json.NETでそれを処理するのはそれほど難しくありません。

using System;
using System.IO;
using Newtonsoft.Json.Linq;

class Program
{
    static void Main(string[] args)
    {
        string text = File.ReadAllText("test.json");
        JToken token = JToken.Parse(text);
        JObject json = JObject.Parse((string) token);
        Console.WriteLine(json);
    }
}

出力:

{
  "SomeResponse": {
    "FIrstAttribute": 8,
    "SecondAttribute": "On",
    "ThirdAttribute": {
      "Id": 2,
      "FirstName": "Okkie",
      "Name": "Bokkie",
      "Street": "",
      "StreetNumber": null,
      "PostCode": "",
      "City": "",
      "Country": ""
    }
  }
}

バックスラッシュが再度エンコードされると予想されるため、バックスラッシュを含むデータでも問題ありませんが、それを再確認する価値があります。

20
Jon Skeet

Newtonsoft.Jsonを使用して、例を以下に示します。

String json="{\"SomeResponse\":{\"FIrstAttribute\":8,\"SecondAttribute\":\"On\",\"ThirdAttribute\":{\"Id\":2,\"FirstName\":\"Okkie\",\"Name\":\"Bokkie\",\"Street\":\"\",\"StreetNumber\":null,\"PostCode\":\"\",\"City\":\"\",\"Country\":\"}}}";     

dynamic result = JsonConvert.DeserializeObject(json);
6
Juan Castillo

うーん...それはまったくJSONではありません。それは奇妙なJSONのような模倣ですが、かなり厄介なものです。あなたは正しいことをしていると思います。

私ができる唯一のことは、単一のエスケープ文字ではなく、文字のペアで置換操作を行うことです:

myString.Replace(@"\""", @"""); // replace \" with "

これにより、ネストされた「\」文字を安全に保持できるため、フィルタリングされたJSONは次のようになります。

field_blah: "root\branch\sub-branch"

「JSON」テキストの詳細なレビューを行い、これがあなたが心配する必要がある唯一のペアのシーケンスであることを確認することを強くお勧めします。他のペアリングがある場合は、上記と同じ方法でそれらを処理します。

0
code4life