前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >认真CS☀️Unity中Newtonsoft.Json的使用

认真CS☀️Unity中Newtonsoft.Json的使用

作者头像
星河造梦坊官方
发布2024-08-15 17:04:14
510
发布2024-08-15 17:04:14
举报
文章被收录于专栏:星河造梦坊专栏

🟥 为什么要用Newtonsoft.Json

使用其他的Json解析工具可能会有问题,比如:

1.Unity自带的JsonUtility不能解析复杂嵌套的json字符串

  • JsonUtility.FromJson(json);将一个json字符串解析成一个类对象
  • JsonUtility.ToJson;将一个类对象转化成一个json字符串

通过上述描述,可知使用该类是需要相应的有一个类并且这个类是标记了[Serializable],类字段也是必须是可序列化的,私有的字段或者被标记[NonSerialized]的字段将被忽略。

注意:

  • json字符串的key需要和类字段的名字完全一样
  • 不能解析复杂嵌套的json字符串

2. LitJson Key和类字段名称需完全一致

  • JsonMapper.ToObject(json);将一个json字符串解析成一个类对象
  • JsonMapper.ToJson;将一个类对象转化成一个json字符串

还提供了stream的方式处理JSON数据,提供的接口是jsonreader和jsonwriter。LitJson这个插件功能很强大可以完成更复杂的json字符串的解析。

但是也有个缺点就是:json字符串中的key也需要和类字段的名字完全一致,如果不对应的话会解析失败。

Newtonsoft.Json:

  • JsonConvert.DeserializeObject(json);将一个json字符串解析成一个类对象
  • JsonConvert.SerializeObject;将一个类对象转化成一个json字符串

Json.Net功能强大,可以完成复杂的json字符串解析,并且性能相当出色。不存在上述缺点。

🟧 下载地址

下载地址:传送门

🟨 注意事项

1️⃣ 切换Unity的API

Mono 平台支持 .net 3.5,Unity的Api要设置为.NET 2.0

否则AS查看log会看到错误:

Could not load type 'Newtonsoft.Json.Linq.JObject' from assembly 'Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'.

2️⃣ JSON在线解析报错:期望’EOF’的JSON验证
代码语言:javascript
复制
Parse error on line 932:
...ssions": 329    }],[    {        "m
---------------------^
Expecting 'EOF'

解决办法:

  • 在JSON中,必须有一个顶级项。即并列的集合外必须加大括号,将他们都括起来
  • 每个并列的元素,必须是Key-Value格式。Key是string格式。
  • 并列的子元素之间,要有逗号。

正确写法:

代码语言:javascript
复制
{
    "response1": [
        {"some": "object"},
        {"some": "object"}
    ],
    "response2": [
        {"some": "object"},
        {"some": "object"}
    ]
}

🟩 示例

1️⃣ 示例1

要解析的Json内容:

[ { "type": "Feature", "properties": { "Name": null, "GuoBiao": "GaosuGonglu", "DefineNumb": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ 113.3456537, 23.105271 ], [ 113.3455005, 23.1037158 ], [ 113.345485, 23.1028259 ] ] } }, { "type": "Feature", "properties": { "Name": "兴南大道", "GuoBiao": "2JiDaolu", "DefineNumb": 4 }, "geometry": { "type": "LineString", "coordinates": [ [ 113.3074994, 23.0168577 ], [ 113.3076886, 23.0168181 ] ] } }]

解析的代码:

代码语言:javascript
复制
using UnityEngine;
using Newtonsoft.Json.Linq;

public class Skode_NewtonsoftJsonDes : MonoBehaviour {

    //要解析的Json内容
    public string content;

	void Start () {
        //获得Json数组:一个Json文件根目录可能有多个类。
        JArray jArray = JArray.Parse(content);      

        //得到字符串 jArray[0]:获得第一个类
        string p1 = jArray[0].ToString();

        //解析Json的一个完整段落     
        //data,你可以通过类似于读取字典的方式,在方扩号里填入标签名称,进而就可以得到相应便签中的字符串
        JObject data = JObject.Parse(p1);

        //得到geometry目录下的字符串
        string geometry = data["geometry"].ToString();

        //我们想要获取一个子标签时,首先要解析其上一层的父标签,就像一层层剥洋葱一样。我们最终想要获取coordinates标签下的东西,那么还得再写一层:     
        JObject g = JObject.Parse(geometry);
        string coordinates = g["coordinates"].ToString();

        //如何将这段拥有多个方括号的字符串转变成想要的数组呢?再次使用神器JArray,它能自动识别出这段字符串为二维数组:
        JArray array = JArray.Parse(coordinates);

        Debug.Log(array[0].ToString());    //结果:[113.3456537,23.105271]
        Debug.Log(array[0][1].ToString());   //结果: 23.105271
    }

    //当然,JArray和JObject类型的数据,除了ToString,还可以ToDouble和ToSingle等,要视具体情况而定。
}
2️⃣ 示例2

解析数据:

代码语言:javascript
复制
{
    "0": {
        "name": "云南有机猕猴桃",
	"price": "19.9元/盒",
        "date_product": "2019.9.17",
        "date_end": "2019.10.18",
        "num": "3"
    },
    "1": {
        "name": "凯特芒果",
	"price": "15.9元/粒",
        "date_product": "2019.9.17",
        "date_end": "2019.10.18",
        "num": "3"
    },
    "2": {
        "name": "嘉定巨玫瑰葡萄",
	"price": "29.9元/盒",
        "date_product": "2019.9.17",
        "date_end": "2019.10.18",
        "num": "3"
    }
}

解析代码:

注意:要获得键值对的值,输入的要是string类型

代码语言:javascript
复制
using Newtonsoft.Json.Linq;
using System.Collections.Generic;
using UnityEngine;

public class Skode_JsonDes : MonoBehaviour {
    public static Skode_JsonDes instance;
    void Awake()
    {
        instance = this;
    }

    public List<Msg> Skode_GetMsg(string str)
    {
        //获得Json数组:一个Json文件根目录可能有多个类。
        JObject jArray = JObject.Parse(str);

        var value = new List<Msg>();

        for (int i = 0; i < jArray.Count; i++)
        {
            //得到字符串 jArray[0]:获得第一个类
            string p1 = jArray[i.ToString()].ToString();

            //解析Json的一个完整段落
            JObject data = JObject.Parse(p1);

            Msg msg = new Msg();
            value.Add(msg);

            //得到geometry目录下的字符串
            value[i].name = data["name"].ToString();
            value[i].price = data["price"].ToString();
            value[i].date_product = data["date_product"].ToString();
            value[i].date_end = data["date_end"].ToString();
            value[i].num = data["num"].ToString();
        }

        return value;
    }
}

public class Msg
{
    public string name;
    public string price;
    public string date_product;
    public string date_end;
    public string num;
}

大家还有什么问题,欢迎在下方留言!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-09-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🟥 为什么要用Newtonsoft.Json
  • 🟧 下载地址
  • 🟨 注意事项
    • 1️⃣ 切换Unity的API
      • 2️⃣ JSON在线解析报错:期望’EOF’的JSON验证
      • 🟩 示例
        • 1️⃣ 示例1
          • 2️⃣ 示例2
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档