2

Newtonsoft.Jsonライブラリを使用して、私が持っていると想像してください

public class Test
{
   public Object Obj { get; set; }
}

今、このようにこれをシリアル化しようとしています

var json = JsonConvert.SerializeObject(new Test(){ Obj = new Uri(@"http://www.google.com") });

...次のJSONを取得します

{
    "Obj": "http://www.google.com"
}

これは明らかに、これをUriオブジェクトに逆シリアル化するのに十分な情報ではありません。実際、逆シリアル化しようとすると、代わりにStringオブジェクトが返されます。

オブジェクトが文字列ではなくURIとして読み戻されるように、ここで型情報を正しくシリアル化および逆シリアル化する既存の方法はありますか?この特定のケースでは、.NETアプリケーションとの相互運用のみを試みており、正確な型を逆シリアル化することが非常に重要です。

前もって感謝します。

4

2 に答える 2

2

文字列をURIに変換し直す場合は、カスタムコンバーター属性を使用できます

コンバーター

public class UriConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return true;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.String)
        {
            //try to create uri out of the string
            Uri uri;
            if(Uri.TryCreate(reader.Value.ToString(), UriKind.Absolute, out uri))
            {
                return uri;
            }
            //just a string -> return string value
            return reader.Value;
        }

        if (reader.TokenType == JsonToken.Null)
        {
            return null;
        }

        throw new InvalidOperationException("Unable to process JSON");
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        if (null == value)
        {
            writer.WriteNull();
            return;
        }

        if (value is Uri)
        {
            writer.WriteValue(((Uri)value).OriginalString);
            return;
        }

        throw new InvalidOperationException("Unable to process JSON");
    }
}

そして、使用属性

 [JsonConverter(typeof(UriConverter))]
 public object Obj {get;set;}

次に、基になるオブジェクトがUriのようなものであるかどうかを判断できるはずです。

  var data = JsonConvert.DeserializeObject<YourObject>(yourJSONString);
  if (data.Obj is Uri)
  {
       ... add logic here
  }
  else
  {
       ... not Uri different logic
  }

Json.NET URI(de)serializationエラーの詳細については、この記事を確認することもできます

于 2012-06-05T18:51:09.700 に答える
1

JSONは、JavaScriptデータ型(文字列、数値、ブール値)のみを認識します。URLがリストにありません。

実際、JSONの全体的なポイントは、緩く型付けされた転送を許可することです。強く型付けされた転送が必要な場合は、WCFバイナリシリアル化などのより強力な転送プロトコルを確認してください。

于 2012-06-05T18:46:22.763 に答える