我正在開發適用于 Android 和 iOS 的 Xamarin Forms 應用程式
我想弄清楚如何將非英文字母傳遞給 Json 檔案。
我的語言是瑞典語,每當我使用 (?, ?, ?) 等字符時,應用程式就會崩潰。
那么我該如何解決這個問題?
抽屜視圖模型.cs
class DrawerViewModel : BaseViewModel {
...
public static DrawerViewModel BindingContext =>
drawerViewModel = PopulateData<DrawerViewModel>("drawer.json");
...
private static T PopulateData<T>(string fileName)
{
var file = "CykelStaden.Data." fileName;
var assembly = typeof(App).GetTypeInfo().Assembly;
T data;
using (var stream = assembly.GetManifestResourceStream(file))
{
var serializer = new DataContractJsonSerializer(typeof(T));
data = (T)serializer.ReadObject(stream);
}
return data;
}
}
抽屜檔案
{
"itemList": [
{
"itemIcon": "\ue729",
"itemName": "L?nd"
},
{
"itemIcon": "\ue72c",
"itemName": "H?jd"
},
{
"itemIcon": "\ue733",
"itemName": "M?tt"
},
{
"itemIcon": "\ue72b",
"itemName": "Inst?llningar"
}
]
}
uj5u.com熱心網友回復:
json 決議器崩潰,因為 json 資料未正確編碼。特殊字符 ( ?, ?, ?) 必須使用相同的\u語法進行編碼。
使用這個應該有效:
{
"itemList": [
{
"itemIcon": "\uE729",
"itemName": "L\u00E4nd"
},
{
"itemIcon": "\uE72C",
"itemName": "H\u00F6jd"
},
{
"itemIcon": "\uE733",
"itemName": "M\u00E5tt"
},
{
"itemIcon": "\uE72B",
"itemName": "Inst\u00E4llningar"
}
]
}
uj5u.com熱心網友回復:
改用 JsonConvert,我在我這邊進行了測驗,效果很好。代碼來自我在這個問題下創建的示例:Write a Text File (or PDF File) from Json in Xamarin.forms
代碼如:
private void saveload_clicked(object sender, EventArgs e)
{
string myfile=Path.Combine(FileSystem.AppDataDirectory,"myjson.txt");
var obj = JsonConvert.DeserializeObject(File.ReadAllText(myfile));
}
uj5u.com熱心網友回復:
出于好奇,我找到了另一個解決方案:https : //docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-character-encoding使用JsonSerializer:
public class DrawerItem
{
[JsonPropertyName("itemIcon")]
public string Icon { get; set; }
[JsonPropertyName("itemName")]
public string Name { get; set; }
}
public class DrawerItemList
{
private static readonly JsonSerializerOptions _serializerOptions = new JsonSerializerOptions
{
// This Encoder allows to parse Unicode Symbols without \uXXXX escaping
Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
};
[JsonPropertyName("itemList")]
public IEnumerable<DrawerItem> DrawerItems { get; set; }
public static DrawerItemList LoadFromEmbeddedJsonFile(CancellationToken cancellationToken = default)
{
return LoadFromEmbeddedJsonFileAsync(cancellationToken).Result;
}
public static async Task<DrawerItemList> LoadFromEmbeddedJsonFileAsync(CancellationToken cancellationToken = default)
{
const string ManifestResourceName = "CykelStaden.Data.drawer.json";
var assembly = Assembly.GetExecutingAssembly();
using (var stream = assembly.GetManifestResourceStream(ManifestResourceName))
{
return await JsonSerializer.DeserializeAsync<DrawerItemList>(stream, _serializerOptions, cancellationToken);
}
}
}
使其與 Xamarin 一起使用netstandard2.0//netstandard2.1
重要提示:要在 Xamarin 專案中執行此操作,必須參考System.Text.JsonNuget 包。(https://www.nuget.org/packages/System.Text.Json)。
您可以使用 .NET CLI(命令列界面)執行此操作:
dotnet add package System.Text.Json
這樣做的原因是System.Text.JsonAPI 最初隨 .NET Core 3 ( https://devblogs.microsoft.com/dotnet/try-the-new-system-text-json-apis/ ) 一起提供,因此未包含在的netstandard2.0或netstandard2.1框架,.NET核心3之前存在。
我如何才能看到我的目標是netstandard2.0還是netstandard2.1?
當您查看.csproj檔案時,您應該看到如下一行:
<TargetFramework>netstandard2.0</TargetFramework>
或者
<TargetFramework>netstandard2.1</TargetFramework>
如果<TargetFramework>包含另一個值,您很可能不必添加System.Text.JsonNuget 包。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/348029.html
