unity json问题

问题是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文本中存储了多个对象,而你读取的时候又将其全部读取出来了,这样转换就出现了错误。
解决方案:

  1. 将读取来的方法修改为(第16行):List<Skill> jsonInfo = JsonUtility.FromJson<List<Skill>>(text);
  2. 可以尝试修改(第14行)代码为一行一行读取,然后在转换代码如下:
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