You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UWP项目读取本地JSON文件遇Newtonsoft.Json解析异常求助

问题解决方案

核心错误原因

你试图将对象数组格式的JSON反序列化为List<string>,但JSON中的每个元素都是包含嵌套结构的复杂对象(不是字符串),这直接导致了JsonReaderException——解析器在期望字符串时遇到了对象的起始符号{。

解决步骤

1. 创建匹配JSON结构的数据模型类

根据你的JSON结构,定义对应的C#类:

public class Trader
{
    // 注意JSON里的键是"taderName"(拼写可能是typo,保持和JSON一致)
    public string taderName { get; set; }
    public List<Quest> quests { get; set; }
}

public class Quest
{
    public string title { get; set; }
    public List<Objective> objectives { get; set; }
}

public class Objective
{
    public string objective { get; set; }
}

2. 修改反序列化与数据加载代码

将反序列化目标类型改为List<Trader>,然后遍历数据提取需要显示的内容添加到ListBox:

private async void LoadData()
{
    StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///questList.json"));
    string jsonText = await FileIO.ReadTextAsync(file);

    // 反序列化为Trader对象列表
    List<Trader> traders = JsonConvert.DeserializeObject<List<Trader>>(jsonText);
    
    // 遍历并提取要显示的内容(示例显示交易商名称+任务标题)
    foreach (Trader trader in traders)
    {
        foreach (Quest quest in trader.quests)
        {
            questList.Items.Add($"{trader.taderName} - {quest.title}");
        }
    }
}

3. (可选)使用数据绑定优化ListBox显示

如果需要更美观的显示(比如展示任务目标),可以通过设置ListBox的ItemTemplate实现数据绑定:

<ListBox x:Name="questList">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock FontWeight="Bold" Text="{Binding taderName}"/>
                <TextBlock Text="{Binding quests[0].title}" Margin="10,0"/>
                <ItemsControl ItemsSource="{Binding quests[0].objectives}">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding objective}" Margin="20,0"/>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

对应的后台代码直接绑定数据源即可:

private async void LoadData()
{
    StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///questList.json"));
    string jsonText = await FileIO.ReadTextAsync(file);
    List<Trader> traders = JsonConvert.DeserializeObject<List<Trader>>(jsonText);
    questList.ItemsSource = traders;
}

额外提示

  • 注意JSON中的taderName可能是traderName的拼写错误,若后续要修正JSON,记得同步修改模型类的属性名称(或用[JsonProperty("taderName")]特性映射)。
  • 确保已正确安装Newtonsoft.Json NuGet包,避免版本兼容问题。

内容的提问来源于stack exchange,提问作者drew trumbaturi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 01:50:25