DataContract / JsonSerializer '@' добавляется к именам переменных

По какой-то причине, когда я сериализую тип (f #):

type JsonKeyValuePair<'T, 'S> =  {
    [<DataMember>] 
    mutable key : 'T
    [<DataMember>] 
    mutable value : 'S
}

let printJson() = 

    use stream = new MemoryStream() 
    use reader = new System.IO.StreamReader(stream)

    let o = {key = "a"; value = 1 }
    let jsonSerializer = Json.DataContractJsonSerializer(typeof<TestGrounds.JsonKeyValuePair<string, int>>)

    jsonSerializer.WriteObject (stream , o)
    stream.Seek(int64 0, SeekOrigin.Begin) |> ignore 

    printfn <| Printf.TextWriterFormat<unit>(reader.ReadToEnd())
    ()

Он генерирует строку:

{"key @": "a", "value @": 1}

и если я попытаюсь десериализовать его без знака @:

let deserialize() = 
    let json = "{\"key\":\"b\",\"value\":2}"
    let o  = deserializeString<TestGrounds.JsonKeyValuePair<string, int>> json
    ()

{"Тип контракта данных 'TestGrounds.JsonKeyValuePair`2 [[System.String, mscorlib, Version = 4.0.0.0, Culture = нейтральный, PublicKeyToken = b77a5c561934e089], [System.Int32, mscorlib, Version = 4.0.0.0, Culture = нейтральный, PublicKeyToken = b77a5c561934e089]] 'не может быть десериализован, поскольку требуемые элементы данных' ключ @, значение @ 'не были найдены. "}

Однако верните @:

let run2 () = 
    let json = "{\"key@\":\"b\",\"value@\":2}"
    let o  = deserializeString<TestGrounds.JsonKeyValuePair<string, int>> json
    ()

и у нас все хорошо. Насколько я знаю, в спецификации Json нет ссылки на @ (http://www.json.org/) ...


person akaphenom    schedule 17.11.2010    source источник
comment
JSON действительно действителен, поэтому до тех пор, пока вы используете его внутри (например, не ожидаете, что сценарии JavaScript будут его использовать - хотя они все еще могут), нет проблем с завершающими символами @.   -  person cdhowie    schedule 17.11.2010


Ответы (1)


F # создает поля с именами key@ и value@ для поддержки свойств с именами key и value. Попробуйте поместить атрибут DataContract в свой тип записи - без него сериализатор проигнорирует атрибуты DataMember и, похоже, просто запишет каждое поле.

person kvb    schedule 17.11.2010