关于这几种语言的json 操作
Lua
local cjson2 = require "cjson" local lua_object = { ["name"] = "Jiang", ["age"] = 24, ["addr"] = "BeiJing", ["email"] = "1569989xxxx@126.com", ["tel"] = "1569989xxxx" } local tmp = cjson2.encode(lua_object)
print(obj["age"])
function Utils:ParseJson( json ) if not json or #json < 2 then--两端{} return end local err,data = pcall(function(json)return cjson.decode(json)end,json); if err == false then data = nil; end return data; end
C# JsonUtility
class Person { public int age; public string name; } private void Awake(){ Person p = new Person(); p.age = 20; p.name = "zhang san"; string json = JsonUtility.ToJson(p, true); Debug.Log(json); var re = JsonUtility.FromJson<Person>(json); Debug.Log(re.age.ToString() + "-------------------"); }
//如果json的key比对象的字段多也可以正常解析
//string json = "{\"addr\": \"BeiJing\",\"tel\": \"1569989xxxx\",\"age\": 24,\"name\": \"Jiang\",\"email\": \"1569989xxxx@126.com\"}";
C# Newtonsoft.Json 上面的如果lua 加了个字段给java,在C#有使用能解析(主要是要申明一个类,其实如果需求在这里变了,改C#不能热更,策划应该能接受)
Newtonsoft是比较原始的字典,不用声明一个类
Dictionary<string, object> dic = new Dictionary<string, object>(); dic["age"] = 25; dic["name"] = "张三"; var item = JsonConvert.SerializeObject(dic); Debug.Log(item); var tmp = JsonConvert.DeserializeObject<Dictionary<string, object>>(item); Debug.Log(tmp["name"].ToString());
Java In Android import org.json.JSONObject
try{ JSONObject jsonObject1 = new JSONObject(); jsonObject1.put("name","zhangsan"); jsonObject1.put("age",12); String tmp = jsonObject1.toString(); Log.i("LogLogLog",tmp); JSONObject js2 = new JSONObject(tmp); String name = js2.getString("name"); Log.i("namenamenamename",name); } catch (Exception e) { }
JSONObject jsonObject = new JSONObject(str); Iterator<String> it = jsonObject.keys(); while(it.hasNext()){ // 获得key String key = it.next(); String value = jsonObject.getString(key); System.out.println("key: "+key+",value:"+value);}
Object-C In iOS
+ (NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString { if (jsonString == nil) { return nil; } NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; NSError *err; NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err]; if(err) { NSLog(@"json解析失败:%@",err); return nil; } return dic; }
+ (NSString *)jsonStringWithDict:(NSDictionary *)dict { NSError *error; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:&error]; NSString *jsonString; if (!jsonData) { NSLog(@"%@",error); }else{ jsonString = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding]; } return jsonString; }
这样再也不怕用户取一些怪名字了。
在C#编辑器中 直接书写json
string json = @"{""succ"":true,""content"":""hah""}"; Dictionary<string, object> jDic = MiniJSON.Json.Deserialize(json) as Dictionary<string, object>; Debug.Log(jDic["succ"]); Debug.Log(jDic["content"]);
Java 中编写
String json = "{\"succ\":true,\"content\":\"hah\"}"; Log.e("json",json);
OC中编写
NSString *json = @"{\"succ\":true,\"content\":\"hah\"}"
在Unity 中使用Json 各种的复杂的类型都是支持的 不支持字典类型 Dictionary<>
using System; using System.Collections; using System.Collections.Generic; using System.Runtime.Serialization; using System.Web; using UnityEngine; using UnityEngine.Networking; public class LearnSharp : MonoBehaviour { // Start is called before the first frame update void Start() { string json = @"{ ""d"": ""dfff"", ""album"": { ""cc"": ""cc"", ""name"": ""The Dark Side of the Moon"", ""artist"": ""Pink Floyd"", ""year"": 1973, ""tracks"": [ ""Speak To Me"", ""Breathe"", ""On The Run"" ], ""tt"": ""tt"", ""tracksOb"": [{ ""trackOb"": ""11"", ""trackObddf"": ""11"" }, { ""trackOb"": ""22"" } ], ""bb"": ""bb"" } }"; var obj = GetData2<Root>(json); Debug.Log(obj.ToString()); } public static T GetData2<T>(string text) where T : class { //JsonData table = AnalysisJson.Analy<JsonData>(text); T t = JsonUtility.FromJson<T>(text); return t; } } [Serializable] public class TracksObItem { public string trackOb; public string newVar; public override string ToString() { string name = ""; return $"{trackOb} {trackOb} "; } public void OnDeserialization(object sender) { Debug.Log("OnDeserialization"); } } [Serializable] public class Album { public string cc; public string name; public string artist; public int year; public List<string> tracks; public string tt; public List<TracksObItem> tracksOb; public string bb; } [Serializable] public class Root { public string d; public Album album; public override string ToString() { string name = ""; return $"{d} {album.name} {album.tracks[1]} {album.tracksOb[1].trackOb} {album.tracksOb[1].newVar}"; } }
这个是例子,感觉功能很强大。数组多层嵌套都支持。