如何将数据转换为List< T>从现有的JSON文件中读取后? [英] How to convert data to a List<T> after reading from an existing JSON file?

查看:116
本文介绍了如何将数据转换为List< T>从现有的JSON文件中读取后?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

UWP 应用中,我需要从现有的
.json  文件中读取,将 JSON 数据转换为列表< T> ,将一些新数据添加到
列表< T> ,将该列表转换为 JSON  数据并将该数据写入相同的现有
.json   file。


我该怎么做?


这是我写的一些代码。

 private async void saveButton_Click(object sender,RoutedEventArgs e)
{
StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
StorageFile samplefile = await storageFolder.CreateFileAsync
(" SavedData.json",CreationCollisionOption.ReplaceExisting);
StorageFile savedFile = await storageFolder.GetFileAsync(" SavedData.json");
string text = await FileIO.ReadTextAsync(savedFile);
var serializer = new DataContractJsonSerializer(typeof(DataFormat));
var ms = new MemoryStream(Encoding.UTF8.GetBytes(text));

列表< DataFormat> data =(List< DataFormat>)serializer.ReadObject(ms);

if(data == null)
{
data = new List< DataFormat>();
}
data.Add(new DataFormat
{
Title = fileText.Text,
Director = fileText1.Text,
Rated = fileText2.Text
});
Stream mystream = await savedFile.OpenStreamForWriteAsync();
serializer.WriteObject(mystream,data);
}




DataFormat类 -

公共类DataFormat:IEquatable< DataFormat> 
{
[DataMember]
public string firstName {get;组; }
[DataMember]
public string lastName {get;组; }
[DataMember]
public string Country {get;组; }

public bool Equals(DataFormat other)
{
string fullName = other.firstName + other.lastName;
if(other == null)
{
return false;
}

return(fullName.Equals(other.fullName));
}

}

当我运行此程序时,会出现此异常 -


System .Runtime.Serialization.SerializationException未被用户代码处理

  HResult = -2146233088

  Message =期望元素'root'来自命名空间''..遇到'无' 名称为'',名称空间''。

  Source = System.Private.DataContractSerialization

  StackTrace:

  &NBSP; &NBSP;   at System.Runtime.Serialization.Json.DataContractJsonSerializerImpl.InternalReadObject(XmlReaderDelegator xmlReader,Boolean verifyObjectName)

  &NBSP; &NBSP;   at System.Runtime.Serialization.XmlObjectSerializer.InternalReadObject(XmlReaderDelegator reader,Boolean verifyObjectName,DataContractResolver dataContractResolver)

  &NBSP; &NBSP;   at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader,Boolean verifyObjectName,DataContractResolver dataContractResolver)

  &NBSP; &NBSP;   at System.Runtime.Serialization.Json.DataContractJsonSerializerImpl.ReadObject(XmlDictionaryReader reader)

  &NBSP; &NBSP;   at System.Runtime.Serialization.Json.DataContractJsonSerializerImpl.ReadObject(Stream stream)

  &NBSP; &NBSP;   at System.Runtime.Serialization.Json.DataContractJsonSerializer.ReadObject(Stream stream)

  &NBSP; &NBSP;  在UWP_TestingGround.MainPage。< saveButton_Click> d__2.MoveNext()

  InnerException: 




[注意:我是C#的新手,所以详细信息会有所帮助。]

解决方案

Hello,


创建DataFormat实例列表,并将它们以JSON格式序列化到文件中。


然后尝试反序列化创建的文件。


在提供的代码中,除非某人有完全相同的情况,否则无法找出问题所在 - 某些代码和数据缺失。 


一个可能的问题 - 您创建/替换SavedData.json - 创建后应该为空的文件 - 并将此空文件用作数据来源。


Hi! 

In my UWP app, I need to read from an existing .json file, convert that JSON data to a List<T>, add some new data to that List<T>, convert to that list to JSON data and write that data to that same existing .json file.

How can I do that?

Here is some code that I have written.

private async void saveButton_Click(object sender, RoutedEventArgs e)
        {
            StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
            StorageFile samplefile = await storageFolder.CreateFileAsync
                ("SavedData.json", CreationCollisionOption.ReplaceExisting);
            StorageFile savedFile = await storageFolder.GetFileAsync("SavedData.json");
            string text = await FileIO.ReadTextAsync(savedFile);
            var serializer = new DataContractJsonSerializer(typeof(DataFormat));
            var ms = new MemoryStream(Encoding.UTF8.GetBytes(text));

            List<DataFormat> data = (List<DataFormat>)serializer.ReadObject(ms);

            if (data == null)
            {
                data = new List<DataFormat>();
            }
            data.Add(new DataFormat
            {
                Title = fileText.Text,
                Director = fileText1.Text,
                Rated = fileText2.Text
            });
            Stream mystream = await savedFile.OpenStreamForWriteAsync();
            serializer.WriteObject(mystream, data);
        }


DataFormat Class-

public class DataFormat : IEquatable<DataFormat>
    {
        [DataMember]
        public string firstName { get; set; }
        [DataMember]
        public string lastName { get; set; }
        [DataMember]
        public string Country { get; set; }

        public bool Equals(DataFormat other)
        {
            string fullName = other.firstName + other.lastName;
            if (other == null)
            {
                return false;
            }

            return (fullName.Equals(other.fullName));
        }
        
    }

When I run this program, this exception appears -

System.Runtime.Serialization.SerializationException was unhandled by user code
  HResult=-2146233088
  Message=Expecting element 'root' from namespace ''.. Encountered 'None'  with name '', namespace ''.
  Source=System.Private.DataContractSerialization
  StackTrace:
       at System.Runtime.Serialization.Json.DataContractJsonSerializerImpl.InternalReadObject(XmlReaderDelegator xmlReader, Boolean verifyObjectName)
       at System.Runtime.Serialization.XmlObjectSerializer.InternalReadObject(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver)
       at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver)
       at System.Runtime.Serialization.Json.DataContractJsonSerializerImpl.ReadObject(XmlDictionaryReader reader)
       at System.Runtime.Serialization.Json.DataContractJsonSerializerImpl.ReadObject(Stream stream)
       at System.Runtime.Serialization.Json.DataContractJsonSerializer.ReadObject(Stream stream)
       at UWP_TestingGround.MainPage.<saveButton_Click>d__2.MoveNext()
  InnerException: 


[Note: I am new in C# so detailed information will be helpful.]

解决方案

Hello,

Create list of instances of your DataFormat and serialize them in JSON format to the file.

Then try to deserialize created file.

On the provided code, unless somebody have exactly the same situation, not possible to find out where is a problem - some code and data missing. 

One of the possible problem - you creating/replacing a SavedData.json - file supposed to be empty after creation - and use this empty file as a source of data.


这篇关于如何将数据转换为List&lt; T&gt;从现有的JSON文件中读取后?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆