2016-12-08 14 views
0

デバイス上のSSIメカニズムによって解析されるJSONドキュメントを作成する必要があります。ドキュメントは実際にはjsonのシリアライズされた辞書になります。単純化のために、それは次のようになりますことを、のは言わせて:serilaized文字列から引用符を削除するにはどうすればよいですか?

LinqPadに生成
var x = new Dictionary<string,object> 
    { 
    ["A"]=new {x = "<!-- ?A.x -->"}, 
    ["B"]=new {x = "<!-- ?B.x -->"} 
    }; 

JsonConvert.SerializeObject(x).Dump(); 

{"A":{"x":"<!-- ?A.x -->"},"B":{"x":"<!-- ?B.x -->"}} 

しかし、実際にそれらの「X」フィールドは数字であり、ときにフェッチからデバイスには、数字が含まれます。だから私は、C#側の文字列であるフィールドの値の前後に引用符なしでこの辞書をシリアル化する必要があるでしょう:

{"A":{"x":<!-- ?A.x -->},"B":{"x":<!-- ?B.x -->}} 

は、どのように私はすべてではない(特定のフィールドの値に引用符を追加していないNewtonsoft Json.NET・シリアライザを強制することができます)シリアル化中に?

ありがとうございます。

+0

'{ "A":{ "X" }、 "B":{ "X"。 }} 'Jsonは無効になりますか? jsonシリアライザが無効なjsonを生成することは期待できません。なぜあなたは文字列を作成しませんか(これは文字列であり、Jsonではありません)? – Liam

+0

私のポイントを証明するには、[JsonLint](http://jsonlint.com/)に '{" A ":{" x ":}、" B ":{" x ":}}'エラー:3行目の解析エラー:{\t "A":{\t \t "x":}、 "B":{' – Liam

+0

@Liam:もちろんこの形式の有効なJSONではありません。そうは言っていない。しかし、セクションを数字に置き換えることで、デバイスが処理した後で有効になります。私はこれが通常の仕事の仕方のまわりではうんざりしていることを知っています。 – ZorgoZ

答えて

0

これを行う方法の1つは、新しいものを導入することです。JsonConverter(sample) "生シリアル化"の機能を分離するために、例えば文字列値をラップするだけの新しい型を導入することができます。

public class RawJson 
{ 
    public string Value { get; private set; } 

    public RawJson(string value) 
    { 
     Value = value; 
    } 
} 

次に、あなただけのコンバータのCanConvert()にこのタイプをチェックしWriteJson()であなただけの

writer.WriteRawValue(((RawJson)value).Value); 
+0

あなたは私に道を与えましたが、解決策はもっと簡単です。私の例は匿名クラスを使用していないので十分ではありませんでしたが、宣言しました。私はあなたの答えを受け入れますが、私は以下の最終版を投稿しています。 – ZorgoZ

0

を書いて、下記のカスタムコンバータを使用するために、@のkiziuの提案に基づいて、実際のソリューション、あることができます。カスタムタイプはありません。コンバーターはクラスやコンバーターだけでなく、メンバーにも属性とともに追加できるので、必要なプロパティでコンバーターを使用できます。上記LinqPadスクラッチ更新:

internal class RawJsonConverter : JsonConverter 
    { 
     public override bool CanConvert(Type objectType) 
     { 
      return objectType == typeof(string); 
     } 

     public override bool CanRead 
     { 
      get { return false; } 
     } 

     public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
     { 
      throw new NotImplementedException(); 
     } 

     public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
     { 
      writer.WriteRawValue((string)value); 
     } 
    } 

class myClass 
{ 
    [JsonConverter(typeof(RawJsonConverter))] 
    public string x; 
} 

void Main() 
{ 
    var x = new Dictionary<string,object> 
     { 
     ["A"]=new myClass {x = "<!-- ?A.x -->"}, 
     ["B"]=new myClass {x = "<!-- ?B.x -->"} 
     }; 


    JsonConvert.SerializeObject(x).Dump(); 
} 

そして予想通りの結果が、ある:

{"A":{"x":<!-- ?A.x -->},"B":{"x":<!-- ?B.x -->}} 
関連する問題