2016-11-08 8 views
0

私は解決できない不満な問題があります。私はいくつかの.jsonデータを逆シリアル化するためにNewtonsoft.Jsonを使用しています。私ははっきりこれは、「グループ・セパレータ」(ASCII 29または0x1Dの)を表し JsonConvert.DeserializeObject(Newtonsoft.Json)でデシリアライズするときに印刷できないアスキー文字(グループセパレータ)を失う

{ '\\', 'u', '0', '0', '1', 'd' } 

文字列があることを、生のJSON文字列で見ることができます。しかし、私が JsonConvert.DeserializeObject<>を使って逆シリアル化するとき、これらの文字シーケンスはオブジェクトに正しく入れられません。代わりに入れられるものは単純に1Dです。あなたが見た文字列を見ればそれは次のとおりです。

29 '\u001d'

6つの別の文字が、これはが起こるかもしれない、なぜ誰もが知っています1.

に置き換えられていますか?私は以下のテストプログラムを含んでいます。残念ながら、それは私が期待する方法とまったく同じです。つまり、6文字がオブジェクトフィールドの "Description"に表示されます。明らかに、私は何かを見逃してしまい、その実際の問題を捕らえていないし、コードの大部分の問題を再現する小さなプログラムをできるだけ試してみるはずです。残念ながら、私は空白になる。だから、私は何を探すべきか、これがどうなるかについてアドバイスを求めています。デシリアライゼーションでこの置き換えは何ですか?実際のオブジェクトは私のTanksの例より複雑ですが、TanksにはIEnumerableのアイデアがあります。

多くのおかげで、 デイブ

class Program 
{ 
    static void Main(string[] args) 
    { 
     JsonSerializerSettings settings = new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }; 
     Tank tank1 = new Tank(); 
     char[] array1 = new char[] { '1', '2', '\\', 'u', '0', '0', '1', 'd', '3', '4' }; 
     tank1.Description = new string(array1);   
     tank1.Id = 1; 
     Console.WriteLine("Original string (showing hidden characters"); 
     for (int i = 0; i < tank1.Description.ToArray().Length; i++) 
     { 
      Console.Write(tank1.Description.ToArray()[i] + " "); 
     } 
     Console.WriteLine(); 

     string conversion1 = JsonConvert.SerializeObject(tank1); 

     Tank deserializedTank1 = JsonConvert.DeserializeObject<Tank>(conversion1, settings); 


     Console.WriteLine("Deserialized string (showing hidden characters"); 
     for (int i = 0; i < deserializedTank1.Description.ToArray().Length; i++) 
     { 
      Console.Write(deserializedTank1.Description.ToArray()[i] + " "); 
     } 
     Console.WriteLine(); 


     Tank tank2 = new Tank() { Id = 2 }; 
     tank2.Description = new string(array1); 
     Tank tank3 = new Tank() { Id = 3 }; 
     tank3.Description = new string(array1); 

     Tanks tanks = new Tanks(); 
     tanks.Group = new [] { tank1, tank2, tank3}; 
     string tanksSerializedString = JsonConvert.SerializeObject(tanks,Formatting.Indented,settings); 

     Tanks deserializedTanks = JsonConvert.DeserializeObject<Tanks>(tanksSerializedString, settings); 

     Console.WriteLine("Deserialized Tanks"); 
     foreach (Tank tank in deserializedTanks.Group) 
     { 
      Console.WriteLine("Deserialized string (showing hidden characters"); 
      for (int i = 0; i < tank.Description.ToArray().Length; i++) 
      { 
       Console.Write(tank.Description.ToArray()[i] + " "); 
      } 
      Console.WriteLine(); 
     } 
    } 
} 

interface ITank 
{ 
    int Id { get; set; } 
    string Description { get; set; } 
} 
public class Tank : ITank 
{ 
    public Tank() { } 
    public string Description { get; set; } 
    public int Id { get; set; } 
} 

public class Tanks 
{ 
    public Tanks() { } 
    public IEnumerable<Tank> Group { get; set; } 
} 
+2

[JSON標準](http://www.json.org/)によると、「\ u four-hex-digits」は、(utf16)ユニコードリテラルを表しています。シリアライザが期待どおりに動作しているように聞こえます。あなたが望んでいなければ、 '\'文字をエスケープする必要があります: "\\ u001d"。 – dbc

+0

ありがとうございました。それは理にかなっている。私はもう少し問題を研究し、それが別の質問を保証したと感じました(http://stackoverflow.com/questions/40486715/how-to-send-group-separator-non-printable-ascii-characters-with-restsharp-rest)私の問題は、RestSharpが私のオブジェクトをどのようにシリアル化するかであると考えています。答えに入れて、あなたが望むなら、私はそのようにマークします。 – Dave

答えて

0

は、シリアライザは期待通りに動作しています。あなたは、という\文字を使用しない場合は

JSON standard for strings

JSON Standardによると、パターン\u four-hex-digitsの文字のシーケンスは、単一の(UTF16)Unicode文字リテラル、\u001dのグループ区切り文字を表します"\\u001d",

関連する問題