私が知る限り、これを行うための組み込みの方法はありません。
この件にはissueがありましたが、終了しました。 問題について著者からのいくつかのコメント:値はのInt32やInt64型であるべきかどうかを知る方法がないため
Json.NETデフォルトでは、Int64型として整数値を読み込み、Int64のは、オーバーフローになりにくいです。型指定されたプロパティの場合、デシリアライザはInt64をInt32に変換することを認識していますが、プロパティが型指定されていないためInt64が取得されています。 [...]これは、Json.NETが動作する方法です。
最も簡単な解決策はcoureのDictionary<string, int>
に種類を変更することですが、私はあなたが数値を読んでいるだけではなく、したがって、object
で立ち往生していると仮定します。
別のオプションはSerialization Callbacksを使用して、手動Int32
にそれらのInt64
Sを変換したり、独自のContract ResolverJsonConverterを作成し、直接(縮小)直列化を制御のいずれかになります。
編集:私はより具体的には少し例を作成しました。
public class Int32Converter : JsonConverter {
public override bool CanConvert(Type objectType) {
// may want to be less concrete here
return objectType == typeof(Dictionary<string, object>);
}
public override bool CanWrite {
// we only want to read (de-serialize)
get { return false; }
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
// again, very concrete
Dictionary<string, object> result = new Dictionary<string, object>();
reader.Read();
while (reader.TokenType == JsonToken.PropertyName) {
string propertyName = reader.Value as string;
reader.Read();
object value;
if (reader.TokenType == JsonToken.Integer)
value = Convert.ToInt32(reader.Value); // convert to Int32 instead of Int64
else
value = serializer.Deserialize(reader); // let the serializer handle all other cases
result.Add(propertyName, value);
reader.Read();
}
return result;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
// since CanWrite returns false, we don't need to implement this
throw new NotImplementedException();
}
}
あなたはどちらかの使用があなたのコンバータまたは(縮小)Serializeメソッドへpass it as parameterを持つメンバーを飾るために属性をすることができます
はここだけ、あなたのspecifc辞書で動作する非常に基本的なコンバータです。
[JsonObject]
public class MyObject {
[JsonConverter(typeof(Int32Converter))]
public Dictionary<string, object> Properties { get; set; }
}
そして、ここで私は実装をテストするために使用されるコードだ:ここで私は属性使用例ですコンバータなしで
class Program {
static void Main(string[] args) {
MyObject test = new MyObject();
test.Properties = new Dictionary<string, object>() { { "int", 15 }, { "string", "hi" }, { "number", 7 } };
Print("Original:", test);
string json = JsonConvert.SerializeObject(test);
Console.WriteLine("JSON:\n{0}\n", json);
MyObject parsed = JsonConvert.DeserializeObject<MyObject>(json);
Print("Deserialized:", parsed);
}
private static void Print(string heading, MyObject obj) {
Console.WriteLine(heading);
foreach (var kvp in obj.Properties)
Console.WriteLine("{0} = {1} of {2}", kvp.Key, kvp.Value, kvp.Value.GetType().Name);
Console.WriteLine();
}
}
が、結果は次のようになります。
Deserialized:
int = 15 of Int64
string = hi of String
number = 7 of Int64
コンバータでは、
Deserialized:
int = 15 of Int32
string = hi of String
number = 7 of Int32
コメント:OPはPOCOオプションを認識しているが、 –