Как скомпилировать Fable.JsonConverter

Я хотел бы использовать Fable.JsonConverter.

Мой тестовый код (почти скопируйте это) FableJson.fs ниже,

module FableJson

open Newtonsoft.Json

// Always use the same instance of the converter
// as it will create a cache to improve performance
let private jsonConverter = Fable.JsonConverter() :> JsonConverter

// Serialization
let toJson value =
    JsonConvert.SerializeObject(value, [|jsonConverter|])

// Deserialization
let ofJson<'T> json =
    JsonConvert.DeserializeObject<'T>(json, [|jsonConverter|])

а также paket.dependencies добавлен файл nuget Fable.JsonConverter

source https://nuget.org/api/v2
storage:none

clitool dotnet-fable
nuget Fable.Core
nuget Fable.Import.Browser
nuget Fable.JsonConverter

а также src/paket.references добавлен файл Fable.JsonConverter

dotnet-fable
Fable.Core
Fable.Import.Browser
Fable.JsonConverter

Но не может скомпилировать.

~~~ snip ~~~
ERROR in ./src/FableJson.fs
d:/SRC/Repos/Fable/testJsonConverter/src/FableJson.fs(11,4): (11,57) error FABLE: Cannot find replacement for Newtonsoft.Json.JsonConvert::SerializeObject
 @ ./src/App.fs 6:0-48
 @ ./src/testJsonConverter.fsproj
 @ multi (webpack)-dev-server/client?http://localhost:8080 ./src/testJsonConverter.fsproj

ERROR in ./src/FableJson.fs
d:/SRC/Repos/Fable/testJsonConverter/src/FableJson.fs(15,4): (15,62) error FABLE: Cannot find replacement for Newtonsoft.Json.JsonConvert::DeserializeObject
 @ ./src/App.fs 6:0-48
 @ ./src/testJsonConverter.fsproj
 @ multi (webpack)-dev-server/client?http://localhost:8080 ./src/testJsonConverter.fsproj

ERROR in ./src/FableJson.fs
d:/SRC/Repos/Fable/testJsonConverter/src/FableJson.fs(7,28): (7,49) error FABLE: Cannot find replacement for Fable.JsonConverter::.ctor
 @ ./src/App.fs 6:0-48
 @ ./src/testJsonConverter.fsproj
 @ multi (webpack)-dev-server/client?http://localhost:8080 ./src/testJsonConverter.fsproj

Что я должен делать?

1 ответ

Решение

Смотрите здесь: http://fable.io/docs/interacting.html

На стороне клиента вы должны использовать Fable.Core.JsInterop функции toJson а также ofJson,

Fable.JsonConverter только для серверной части. Оно использует Newtonsoft.JsonЭто библиотека.NET, которая не работает в браузере. Вы получаете ошибку компиляции, потому что Fable не знает, как конвертировать Newtonsoft.Json вызовы функций в JavaScript.

Это может сбивать с толку, когда вы работаете с языком, который работает в одной среде выполнения (например,.NET), а также компилируется в другой (например, JS), но вы должны попытаться сохранить четкую мысленную модель, в которой выполняется весь ваш код и, следовательно, к чему он имеет доступ.

@Maslow прав, в Fable 2 мы удалили Fable.JsonConverter в пользу библиотеки, созданной сообществом.

  • Thoth.Json предлагает опыт, подобный Elm, где вы можете декодировать JSON вручную или автоматически в зависимости от ваших предпочтений. Эта библиотека также предлагает хорошее сообщение об ошибке
  • Fable.SimpleJson библиотека для разбора и преобразования JSON в проектах Fable

Thoth.Json дополняется Thoth.Json.Net, чтобы вы могли использовать тот же API на бэкэнде.

Я думаю, что Fable.SimpleJson также предлагает поддержку серверной части, но я не уверен.

Вы можете использовать собственный API JavaScript Fable.Core.JS.JSON.stringify а также Fable.Core.JS.JSON.parse(x) но вам придется использовать unbox/cast, чтобы указать тип ваших данных, который небезопасен и может легко сломаться.

Принятый ответ больше не действителен. Для более новой Fable единственное, что мне удалось найти, этоFable.Core.JS.JSON.stringifyкоторый вызывает встроенный сериализатор браузера. ТакжеFable.Core.JS.JSON.parse(x) который возвращается obj.

Другие вопросы по тегам