【问题标题】:Deserializing json throwing 'Additional text encountered' error反序列化 json 抛出“遇到其他文本”错误
【发布时间】:2018-08-19 19:38:06
【问题描述】:

所以我试图将一些数据反序列化到一个集合中。 当我尝试反序列化包含 json 的文件的内容时遇到问题。

这就是我存储数据的方式。

WebItem = new WebsiteItemViewModel
                    {
                        Title = "Twitter Item",
                        Description = "Here is a long description that might be crossing the bounds but thats fine.",
                        Image = "../resources/twitter.png"
                    };

                    string resultJson2 = JsonConvert.SerializeObject(WebItem);
                    File.AppendAllText("Testfile", resultJson2);

这就是我尝试反序列化数据的方式:

private void OnLoadData_Click(object sender, RoutedEventArgs e)
        {
            string data = File.ReadAllText("Testfile");
            var deserialize = JsonConvert.DeserializeObject<WebsiteItemViewModel>(data);
        }

但是当我点击反序列化时,它会抛出该错误

Newtonsoft.Json.JsonReaderException: '遇到其他文本 读完 JSON 内容后:{.路径'',第 1 行,位置 154.'

这就是 json 数据的样子。

{"Title":"Facebook Item","Description":"这是一个很长的描述 这可能会越界,但就是这样 很好。","图片":"../resources/Facebook.png"}{"标题":"Facebook Item","Description":"这是一个很长的描述,可能会交叉 界限,但仅此而已 很好。","图片":"../resources/Facebook.png"}{"标题":"Twitter Item","Description":"这是一个很长的描述,可能会交叉 界限,但仅此而已 很好。","图片":"../resources/twitter.png"}{"标题":"Facebook Item","Description":"这是一个很长的描述,可能会交叉 界限,但仅此而已 很好。","图片":"../resources/Facebook.png"}{"标题":"Twitter Item","Description":"这是一个很长的描述,可能会交叉 界限,但仅此而已 很好。","图片":"../resources/twitter.png"}{"标题":"推特 Item","Description":"这是一个很长的描述,可能会交叉 界限,但仅此而已 很好。","图片":"../resources/twitter.png"}{"标题":"Facebook Item","Description":"这是一个很长的描述,可能会交叉 界限,但仅此而已 很好。","图片":"../resources/Facebook.png"}{"标题":"Facebook Item","Description":"这是一个很长的描述,可能会交叉 界限,但仅此而已 很好。","图片":"../resources/Facebook.png"}{"标题":"Twitter Item","Description":"这是一个很长的描述,可能会交叉 界限,但仅此而已 很好。","图片":"../resources/twitter.png"}{"标题":"Facebook Item","Description":"这是一个很长的描述,可能会交叉 界限,但仅此而已 很好。","图片":"../resources/Facebook.png"}{"标题":"Twitter Item","Description":"这是一个很长的描述,可能会交叉 界限,但仅此而已 很好。","图片":"../resources/twitter.png"}{"标题":"推特 Item","Description":"这是一个很长的描述,可能会交叉 界限,但仅此而已 很好。","图片":"../resources/twitter.png"}{"标题":"Facebook Item","Description":"这是一个很长的描述,可能会交叉 界限,但仅此而已 很好。","图片":"../resources/Facebook.png"}{"标题":"Facebook Item","Description":"这是一个很长的描述,可能会交叉 界限,但仅此而已 很好。","图片":"../resources/Facebook.png"}{"标题":"Facebook Item","Description":"这是一个很长的描述,可能会交叉 界限,但仅此而已 很好。","图片":"../resources/Facebook.png"}{"标题":"Twitter Item","Description":"这是一个很长的描述,可能会交叉 界限,但没关系。","Image":"../resources/twitter.png"}

型号

[Serializable]
public class ClassName...

[JsonProperty("Title")]
        public string Title
        {
            get { return _title; }
            set
            {
                _title = value;
                OnPropertyChanged("Title");
            }
        }

        [JsonProperty("Description")]
        public string Description
        {
            get { return _description; }
            set
            {
                _description = value;
                OnPropertyChanged("Description");
            }
        }

        [JsonProperty("Image")]
        public string Image
        {
            get { return _image; }
            set
            {
                _image = value;
                OnPropertyChanged("Image");
            }
        }

【问题讨论】:

  • 您的 json 数据无效
  • 文件内容似乎不是有效的 json。似乎因为使用了File.AppendAllText,您只是将一些 json 对象一个接一个地放在文件中。
  • 哦,我如何一次追加一个对象以使 id 有效?
  • @MarkDenom 你想读取 json 数据是一个数组吗?
  • 其实你需要在文件中存储一个json数组。

标签: c# .net json


【解决方案1】:

我会通过一种方法将Object Json 数据反序列化为List&lt;WebsiteItemViewModel&gt; 集合对象。

private List<WebsiteItemViewModel> readData()
{
    string data = File.ReadAllText("Testfile");
    return JsonConvert.DeserializeObject<List<WebsiteItemViewModel>>(data) ?? new List<WebsiteItemViewModel>();
}

然后您可以在集合中追加您的WebsiteItemViewModel 类型WebItem 新对象,然后使用WriteAllText 覆盖文件以确保JSON 数据是最新的。

var list = readData();

WebsiteItemViewModel WebItem = new WebsiteItemViewModel
{
    Title = "Twitter Item",
    Description = "Here is a long description that might be crossing the bounds but thats fine.",
    Image = "../resources/twitter.png"
};

list.Add(WebItem);
string resultJson2 = JsonConvert.SerializeObject(list);
File.WriteAllText("Testfile", resultJson2);

注意

使用WriteAllText 而不是AppendAllText,因为AppendAllText 将在末尾附加JSON 数据。

WriteAllText 将覆盖文件以使您的 JSON 成为有效的数组字符串。

【讨论】:

  • 啊,这很有意义,json.net 的新手这是一个很好的答案
  • @MarkDenom 没问题很高兴为您提供帮助:)
  • 如果文件一开始是空的怎么办?然后它会抛出一个空异常
  • 对不起,我错过了在返回方法中使用return JsonConvert.DeserializeObject&lt;List&lt;WebsiteItemViewModel&gt;&gt;(data) ?? new List&lt;WebsiteItemViewModel&gt;();。确保数组不是null
【解决方案2】:

由于您尚未将所有对象序列化为对象数组,因此就我在您的 json 文件中看到的而言,您缺少开始和结束大括号。换句话说,您还没有构建正确的 json 文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 2014-02-19
    • 2022-11-28
    • 1970-01-01
    相关资源
    最近更新 更多