问题是FromJson 我使用ToJson 写入都没有问题 但是只要读取就出问题
我写的代码如下
下面tojson 一点问题 skill也放在下面了
通过tosjon写入的文件也放下面了 写入都成功
我的问题是FromJson 我只要读取 就在
Skill jsonInfo = JsonUtility.FromJson(text);
这行就提示我错误 我看了很多说明 修改了好几次 我实在无能为力了
请求大神帮我解决下 我需要如何修改
但是请不要让我换其他json读取方式 我只想用JsonUtility 这个读取出来
public class tast : MonoBehaviour
{
private void Start()
{
FromJson();
//ToJson();
}
static void FromJson()
{
string path = Application.dataPath + "/ww.text";
StreamReader streamReader = new StreamReader(path);
string text = streamReader.ReadToEnd(); //全部读取
Debug.Log(text);
Skill jsonInfo = JsonUtility.FromJson(text);
}
public void ToJson()
{
List tt = new List(); //建立list
tt.Add(new Skill(1001, "天山神功", 100));
tt.Add(new Skill(1002, "天山功", 90));
tt.Add(new Skill(1003, "天神功", 80));
tt.Add(new Skill(1004, "天山神", 70));
tt.Add(new Skill(1005, "天功", 60));
string path = Application.dataPath + "/ww.text"; //文件夹位置
foreach (Skill aa in tt)
{
string s = JsonUtility.ToJson(aa);
StreamWriter streamWriter = new StreamWriter(path, true);
streamWriter.Write(s); //写入
streamWriter.Close();// 关闭
}
}
}
[Serializable]
public class Skill
{
public int id;
public string name;
public int age;
public Skill(int id, string name, int age)
{
this.id = id;
this.name = name;
this.age = age;
}
}
下面是我通过我自己的tojson 写入的ww.text文件 这个写入没问题 主要是读取 我读取不回来
{"id":1001,"name":"天山神功","age":100}{"id":1001,"name":"天山神功","age":100}{"id":1002,"name":"天山功","age":90}{"id":1003,"name":"天神功","age":80}{"id":1004,"name":"天山神","age":70}{"id":1005,"name":"天功","age":60}
读不回来就对了
因为你是循环的把好多次toJson的内容丢到同一个文件里去了
那你读回来的时候也应该循环读,分别还原成原来的对象
要么你整个生成一个json串写文件,就可以一下都读回来
-=-=-
说白了,你把好多个skill对象生成的string放到了一起,读的时候没区分,想直接把它们变成一个Skill,那变的成才怪
我们不去纠结技术细节,你就当它是魔法
你用魔法把许多人变成了青蛙
现在你想把所有青蛙变回一个人,你觉得有可能吗
你这读写逻辑基本正确,Json是支持将字符串转换为类的。
你的问题出现在一个txt文本中存储了多个对象,而你读取的时候又将其全部读取出来了,这样转换就出现了错误。
解决方案:
List<Skill> jsonInfo = JsonUtility.FromJson<List<Skill>>(text);
while (true)
{
//读取一行字符串
string text = streamReader.ReadLine();
if (string.IsNullOrEmpty(text))
{
Debug.Log(text);
Skill jsonInfo = JsonUtility.FromJson<Skill>(text);
}else{
break;
}
}
思路是将你的集合序列化成JSON数组,然后将其保存到文件,读取时再反序列化这个JSON数组为对应的集合即可。
用.NET 6自带的System.Text.Json
写了一个简单的序列化和反序列化的示例,供参考:
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.Json;
namespace ConsoleApp1
{
internal static class Program
{
//文件位置
private const string PATH = @"D:\tmp\ww.text";
private static void Main()
{
ToJson();
FromJson();
}
static void FromJson()
{
var json = File.ReadAllText(PATH);
var jsonInfo = JsonSerializer.Deserialize<List<Skill>>(json);
foreach (var info in jsonInfo)
{
Console.WriteLine($"{info.id}, {info.name}, {info.age}");
}
}
static void ToJson()
{
var tt = new List<Skill>(); //建立list
tt.Add(new Skill(1001, "天山神功", 100));
tt.Add(new Skill(1002, "天山功", 90));
tt.Add(new Skill(1003, "天神功", 80));
tt.Add(new Skill(1004, "天山神", 70));
tt.Add(new Skill(1005, "天功", 60));
File.WriteAllText(PATH, JsonSerializer.Serialize(tt));
Console.WriteLine("文件保存成功");
// foreach (Skill aa in tt)
// {
// string s = JsonUtility.ToJson(aa);
// StreamWriter streamWriter = new StreamWriter(path, true);
// streamWriter.Write(s); //写入
// streamWriter.Close();// 关闭
// }
}
}
public class Skill
{
public int id { get; set; }
public string name { get; set; }
public int age { get; set; }
public Skill(int id, string name, int age)
{
this.id = id;
this.name = name;
this.age = age;
}
}
}
运行结果:
文件保存成功
1001, 天山神功, 100
1002, 天山功, 90
1003, 天神功, 80
1004, 天山神, 70
1005, 天功, 60