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

发布于:2022-12-20 ⋅ 阅读:(719) ⋅ 点赞:(0)

在这里插入图片描述

 

目录

🟥 为什么要用Newtonsoft.Json

🟧 下载地址

🟨 注意事项

1️⃣ 切换Unity的API

2️⃣ JSON在线解析报错:期望’EOF’的JSON验证

🟩 示例

1️⃣ 示例1

2️⃣ 示例2


🟥 为什么要用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验证

Parse error on line 932:
...ssions": 329    }],[    {        "m
---------------------^
Expecting 'EOF'

解决办法:

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

正确写法:

{
    "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 ]   ]  } }]

解析的代码:

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

解析数据:

{
    "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类型

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;
}

 

 

 

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


 

在这里插入图片描述


如果你有 技术的问题 或 项目开发

都可以加下方联系方式

和我聊一聊你的故事🧡

 

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到