Serialize และ Deserialize Json และ Json Array ใน Unity


99

ฉันมีรายการที่ส่งจากไฟล์ PHP ไปยัง Unity โดยใช้WWW.

WWW.textดูเหมือนว่า:

[
    {
        "playerId": "1",
        "playerLoc": "Powai"
    },
    {
        "playerId": "2",
        "playerLoc": "Andheri"
    },
    {
        "playerId": "3",
        "playerLoc": "Churchgate"
    }
]

ที่ฉันตัดส่วนพิเศษ[]จากไฟล์string. เมื่อฉันพยายามแยกวิเคราะห์โดยใช้Boomlagoon.JSONเพียงวัตถุแรกเท่านั้นที่จะถูกเรียกคืน ฉันพบว่าฉันต้องdeserialize()อยู่ในรายชื่อและได้นำเข้า MiniJSON

แต่ฉันสับสนว่าdeserialize()รายการนี้เป็นอย่างไร ฉันต้องการวนซ้ำออบเจ็กต์ JSON ทุกตัวและดึงข้อมูล ฉันจะทำสิ่งนี้ใน Unity โดยใช้ C # ได้อย่างไร

ชั้นเรียนที่ฉันใช้คือ

public class player
{
    public string playerId { get; set; }
    public string playerLoc { get; set; }
    public string playerNick { get; set; }
}

หลังจากตัดแต่ง[]ฉันสามารถแยกวิเคราะห์ json โดยใช้ MiniJSON KeyValuePairแต่มันก็จะกลับมาเพียงครั้งแรก

IDictionary<string, object> players = Json.Deserialize(serviceData) as IDictionary<string, object>;

foreach (KeyValuePair<string, object> kvp in players)
{
    Debug.Log(string.Format("Key = {0}, Value = {1}", kvp.Key, kvp.Value));
}

ขอบคุณ!


ทำไมคุณถึงถอดด้านนอก[และ]? นั่นคือสิ่งที่ทำให้เป็นรายการ เพียงแค่หยุดการลบสิ่งนั้นและกำหนดค่าเริ่มต้นเป็นอาร์เรย์หรือรายการและฉันคาดหวังว่ามันจะดี กรุณาโพสต์รหัสที่คุณได้ลองใช้
Jon Skeet

แสดงคลาสที่ใช้สำหรับ deserialization รูปแบบแปลกมากทำไม playerId คนที่สองไม่ห่อหุ้มไว้ในวงเล็บปีกกา? ควร deserialize รายการของบางสิ่งบางอย่างเช่นList<PlayerLocation>เพราะนี่คืออาร์เรย์
Maximilian Gerhardt

@MaximilianGerhardt ขออภัยวงเล็บปีกกาพิมพ์ผิด แก้ไขในคำถามและเพิ่มรหัสด้วย ขอบคุณ.
dil33pm

1
ฉันคิดว่ามีบางอย่างผิดปกติกับความเข้าใจของคุณเกี่ยวกับวิธีที่ห้องสมุดนี้จัดการกับ deserializiation มันไม่ใช่ deserialization ตามปกติ (อย่างที่คุณอาจเห็นNewtonsoft.Json) แต่Json.Deserialize()มักจะส่งคืน a IDictionary<string,object>ให้คุณและคุณดำเนินการต่อList<object>ไป ดูที่stackoverflow.com/a/22745634/5296568 โดยเฉพาะอย่างยิ่งรับโปรแกรม deserializer JSON ที่ดีกว่าซึ่งจะทำการ deserialization ที่คุณคุ้นเคย
Maximilian Gerhardt

@MaximilianGerhardt IDictionary<string,object>ฉันพยายามกับ ฉันสามารถดึงคุณค่าออกมาได้ แต่เพียงครั้งแรกKeyValuePair<>เท่านั้น
dil33pm

คำตอบ:


251

Unity เพิ่มJsonUtilityให้กับ API ของพวกเขาหลังจากอัปเดต5.3.3 ลืมเกี่ยวกับไลบรารีของบุคคลที่สามทั้งหมดเว้นแต่คุณจะทำอะไรที่ซับซ้อนกว่านั้น JsonUtility เร็วกว่าไลบรารี Json อื่น ๆ อัปเดตเป็น Unity 5.3.3เวอร์ชันขึ้นไปจากนั้นลองวิธีแก้ไขด้านล่าง

JsonUtilityเป็น API ที่มีน้ำหนักเบา รองรับเฉพาะประเภทพื้นฐานเท่านั้น มันไม่ได้สนับสนุนคอลเลกชันเช่นพจนานุกรม Listข้อยกเว้นหนึ่งคือ รองรับListและListอาร์เรย์!

หากคุณต้องการทำให้เป็นซีเรียลไลซ์Dictionaryหรือทำสิ่งอื่นที่ไม่ใช่เพียงแค่การทำให้เป็นอนุกรมและการแยกประเภทข้อมูลอย่างง่ายให้ใช้ API ของบุคคลที่สาม มิฉะนั้นอ่านต่อ

ตัวอย่างคลาสที่จะทำให้เป็นอนุกรม:

[Serializable]
public class Player
{
    public string playerId;
    public string playerLoc;
    public string playerNick;
}

1. วัตถุประสงค์ข้อมูลหนึ่งรายการ (NON-ARRAY JSON)

การทำให้เป็นอนุกรมส่วน A :

อนุกรมกับ Json ด้วยpublic static string ToJson(object obj);วิธีการ

Player playerInstance = new Player();
playerInstance.playerId = "8484239823";
playerInstance.playerLoc = "Powai";
playerInstance.playerNick = "Random Nick";

//Convert to JSON
string playerToJson = JsonUtility.ToJson(playerInstance);
Debug.Log(playerToJson);

เอาท์พุต :

{"playerId":"8484239823","playerLoc":"Powai","playerNick":"Random Nick"}

การทำให้เป็นอนุกรมส่วน B :

ทำให้เป็นอนุกรมกับ Json ด้วยpublic static string ToJson(object obj, bool prettyPrint);วิธีโอเวอร์โหลด เพียงแค่ส่งผ่านtrueไปยังJsonUtility.ToJsonฟังก์ชันจะจัดรูปแบบข้อมูล เปรียบเทียบเอาต์พุตด้านล่างกับเอาต์พุตด้านบน

Player playerInstance = new Player();
playerInstance.playerId = "8484239823";
playerInstance.playerLoc = "Powai";
playerInstance.playerNick = "Random Nick";

//Convert to JSON
string playerToJson = JsonUtility.ToJson(playerInstance, true);
Debug.Log(playerToJson);

เอาท์พุต :

{
    "playerId": "8484239823",
    "playerLoc": "Powai",
    "playerNick": "Random Nick"
}

Deserializing ส่วน A :

Deserialize json ด้วยpublic static T FromJson(string json);method overload

string jsonString = "{\"playerId\":\"8484239823\",\"playerLoc\":\"Powai\",\"playerNick\":\"Random Nick\"}";
Player player = JsonUtility.FromJson<Player>(jsonString);
Debug.Log(player.playerLoc);

Deserializing ส่วน B :

Deserialize json ด้วยpublic static object FromJson(string json, Type type);method overload

string jsonString = "{\"playerId\":\"8484239823\",\"playerLoc\":\"Powai\",\"playerNick\":\"Random Nick\"}";
Player player = (Player)JsonUtility.FromJson(jsonString, typeof(Player));
Debug.Log(player.playerLoc);

Deserializing ส่วน C :

Deserialize json ด้วยpublic static void FromJsonOverwrite(string json, object objectToOverwrite);วิธีการ เมื่อJsonUtility.FromJsonOverwriteถูกใช้จะไม่มีการสร้างอินสแตนซ์ใหม่ของ Object นั้นที่คุณกำลัง deserializing จะถูกสร้างขึ้น มันจะนำอินสแตนซ์ที่คุณส่งผ่านไปใช้ซ้ำและเขียนทับค่าของมัน

สิ่งนี้มีประสิทธิภาพและควรใช้ถ้าเป็นไปได้

Player playerInstance;
void Start()
{
    //Must create instance once
    playerInstance = new Player();
    deserialize();
}

void deserialize()
{
    string jsonString = "{\"playerId\":\"8484239823\",\"playerLoc\":\"Powai\",\"playerNick\":\"Random Nick\"}";

    //Overwrite the values in the existing class instance "playerInstance". Less memory Allocation
    JsonUtility.FromJsonOverwrite(jsonString, playerInstance);
    Debug.Log(playerInstance.playerLoc);
}

2. ข้อมูลหลายรายการ (ARRAY JSON)

Json ของคุณมีออบเจ็กต์ข้อมูลหลายตัว ยกตัวอย่างเช่นplayerIdที่ปรากฏมากกว่าหนึ่งครั้ง Unity JsonUtilityไม่รองรับอาร์เรย์เนื่องจากยังใหม่อยู่ แต่คุณสามารถใช้คลาสตัวช่วยจากบุคคลนี้เพื่อให้อาร์เรย์ทำงานJsonUtilityได้

สร้างคลาสชื่อJsonHelper. คัดลอก JsonHelper โดยตรงจากด้านล่าง

public static class JsonHelper
{
    public static T[] FromJson<T>(string json)
    {
        Wrapper<T> wrapper = JsonUtility.FromJson<Wrapper<T>>(json);
        return wrapper.Items;
    }

    public static string ToJson<T>(T[] array)
    {
        Wrapper<T> wrapper = new Wrapper<T>();
        wrapper.Items = array;
        return JsonUtility.ToJson(wrapper);
    }

    public static string ToJson<T>(T[] array, bool prettyPrint)
    {
        Wrapper<T> wrapper = new Wrapper<T>();
        wrapper.Items = array;
        return JsonUtility.ToJson(wrapper, prettyPrint);
    }

    [Serializable]
    private class Wrapper<T>
    {
        public T[] Items;
    }
}

การทำให้อนุกรม Json Array :

Player[] playerInstance = new Player[2];

playerInstance[0] = new Player();
playerInstance[0].playerId = "8484239823";
playerInstance[0].playerLoc = "Powai";
playerInstance[0].playerNick = "Random Nick";

playerInstance[1] = new Player();
playerInstance[1].playerId = "512343283";
playerInstance[1].playerLoc = "User2";
playerInstance[1].playerNick = "Rand Nick 2";

//Convert to JSON
string playerToJson = JsonHelper.ToJson(playerInstance, true);
Debug.Log(playerToJson);

เอาท์พุต :

{
    "Items": [
        {
            "playerId": "8484239823",
            "playerLoc": "Powai",
            "playerNick": "Random Nick"
        },
        {
            "playerId": "512343283",
            "playerLoc": "User2",
            "playerNick": "Rand Nick 2"
        }
    ]
}

Deserializing Json Array :

string jsonString = "{\r\n    \"Items\": [\r\n        {\r\n            \"playerId\": \"8484239823\",\r\n            \"playerLoc\": \"Powai\",\r\n            \"playerNick\": \"Random Nick\"\r\n        },\r\n        {\r\n            \"playerId\": \"512343283\",\r\n            \"playerLoc\": \"User2\",\r\n            \"playerNick\": \"Rand Nick 2\"\r\n        }\r\n    ]\r\n}";

Player[] player = JsonHelper.FromJson<Player>(jsonString);
Debug.Log(player[0].playerLoc);
Debug.Log(player[1].playerLoc);

เอาท์พุต :

Powai

ผู้ใช้ 2


หากนี่คืออาร์เรย์ Json จากเซิร์ฟเวอร์และคุณไม่ได้สร้างด้วยมือ :

คุณอาจจะต้องเพิ่ม{"Items":หน้าสตริงที่ได้รับจากนั้นเพิ่ม}ที่ส่วนท้ายของสตริง

ฉันสร้างฟังก์ชันง่ายๆสำหรับสิ่งนี้:

string fixJson(string value)
{
    value = "{\"Items\":" + value + "}";
    return value;
}

จากนั้นคุณสามารถใช้งานได้:

string jsonString = fixJson(yourJsonFromServer);
Player[] player = JsonHelper.FromJson<Player>(jsonString);

3. deserialize สตริง json โดยไม่มีคลาส && De-serializing Json ด้วยคุณสมบัติตัวเลข

นี่คือ Json ที่ขึ้นต้นด้วยคุณสมบัติตัวเลขหรือตัวเลข

ตัวอย่างเช่น:

{ 
"USD" : {"15m" : 1740.01, "last" : 1740.01, "buy" : 1740.01, "sell" : 1744.74, "symbol" : "$"}, 

"ISK" : {"15m" : 179479.11, "last" : 179479.11, "buy" : 179479.11, "sell" : 179967, "symbol" : "kr"},

"NZD" : {"15m" : 2522.84, "last" : 2522.84, "buy" : 2522.84, "sell" : 2529.69, "symbol" : "$"}
}

Unity's JsonUtilityไม่รองรับสิ่งนี้เนื่องจากคุณสมบัติ "15m" เริ่มต้นด้วยตัวเลข ตัวแปรคลาสไม่สามารถเริ่มต้นด้วยจำนวนเต็ม

ดาวน์โหลดSimpleJSON.csจากความสามัคคีของวิกิพีเดีย

หากต้องการรับทรัพย์สิน "15m" ของ USD:

var N = JSON.Parse(yourJsonString);
string price = N["USD"]["15m"].Value;
Debug.Log(price);

ในการรับคุณสมบัติ "15m" ของ ISK:

var N = JSON.Parse(yourJsonString);
string price = N["ISK"]["15m"].Value;
Debug.Log(price);

หากต้องการรับคุณสมบัติ "15m" ของ NZD:

var N = JSON.Parse(yourJsonString);
string price = N["NZD"]["15m"].Value;
Debug.Log(price);

คุณสมบัติ Json ที่เหลือที่ไม่ได้ขึ้นต้นด้วยตัวเลขสามารถจัดการได้โดย JsonUtility ของ Unity


4. การแก้ปัญหา Json

ปัญหาในการต่ออนุกรมกับJsonUtility.ToJson?

รับสตริงว่างหรือ " {}" ด้วยJsonUtility.ToJson?

. ตรวจสอบให้แน่ใจว่าคลาสไม่ใช่อาร์เรย์ ถ้าเป็นเช่นนั้นให้ใช้คลาสตัวช่วยด้านบนJsonHelper.ToJsonแทนJsonUtility.ToJsonด้วย

. เพิ่ม[Serializable]ที่ด้านบนสุดของคลาสที่คุณกำลังต่ออนุกรม

. ลบคุณสมบัติออกจากคลาส ยกตัวอย่างเช่นในตัวแปรลบpublic string playerId { get; set; } { get; set; }Unity ไม่สามารถทำให้เป็นอนุกรมได้

ปัญหาเมื่อ deserializing ด้วยJsonUtility.FromJson?

. ถ้าคุณได้รับNullตรวจสอบให้แน่ใจว่า Json ไม่ใช่อาร์เรย์ Json ถ้าเป็นเช่นนั้นให้ใช้คลาสตัวช่วยด้านบนJsonHelper.FromJsonแทนJsonUtility.FromJsonด้วย

. หากคุณได้รับNullReferenceExceptionขณะ deserializing ให้เพิ่ม[Serializable]ที่ด้านบนสุดของชั้นเรียน

C.ปัญหาอื่น ๆ ตรวจสอบว่า json ของคุณถูกต้อง ไปที่ไซต์นี้ที่นี่และวาง json ควรแสดงให้คุณเห็นว่า json ถูกต้องหรือไม่ นอกจากนี้ยังควรสร้างคลาสที่เหมาะสมด้วย Json อย่าลืมลบลบ ออก { get; set; }จากแต่ละตัวแปรและเพิ่ม[Serializable]ที่ด้านบนของแต่ละคลาสที่สร้างขึ้น


Newtonsoft.Json:

หากมีเหตุผลบางNewtonsoft.Jsonจะต้องใช้แล้วตรวจสอบรุ่นคดเคี้ยวสามัคคีที่นี่ โปรดทราบว่าคุณอาจพบข้อขัดข้องหากใช้คุณลักษณะบางอย่าง ระวัง.


เพื่อตอบคำถามของคุณ :

ข้อมูลเดิมของคุณคือ

 [{"playerId":"1","playerLoc":"Powai"},{"playerId":"2","playerLoc":"Andheri"},{"playerId":"3","playerLoc":"Churchgate"}]

เพิ่ม {"Items":ในด้านหน้าของมันแล้วเพิ่ม }ที่จุดสิ้นสุดของมัน

รหัสในการทำสิ่งนี้:

serviceData = "{\"Items\":" + serviceData + "}";

ตอนนี้คุณมี:

 {"Items":[{"playerId":"1","playerLoc":"Powai"},{"playerId":"2","playerLoc":"Andheri"},{"playerId":"3","playerLoc":"Churchgate"}]}

ที่จะเป็นอันดับหลายข้อมูลจาก PHP เป็นอาร์เรย์ตอนนี้คุณสามารถทำ

public player[] playerInstance;
playerInstance = JsonHelper.FromJson<player>(serviceData);

playerInstance[0] เป็นข้อมูลแรกของคุณ

playerInstance[1] เป็นข้อมูลที่สองของคุณ

playerInstance[2] เป็นข้อมูลที่สามของคุณ

หรือข้อมูลภายในชั้นเรียนด้วยplayerInstance[0].playerLoc, playerInstance[1].playerLoc, playerInstance[2].playerLoc......

คุณสามารถใช้playerInstance.Lengthตรวจสอบความยาวก่อนเข้าถึงได้

หมายเหตุ: ลบออก { get; set; }จากplayerชั้นเรียน ถ้าคุณมี{ get; set; }มันจะไม่ทำงาน ความสามัคคีของJsonUtilityไม่ไม่ทำงานร่วมกับสมาชิกชั้นเรียนที่จะถูกกำหนดเป็นคุณสมบัติ


ฉันกำลังจะกลับอาร์เรย์ของแถวหนึ่งmysqlแบบสอบถามจาก PHP json_encode($row)ใช้ ดังนั้นการตอบสนองประกอบด้วย JSONObjects [{"playerId":"1","playerLoc":"Powai"},{"playerId":"2","playerLoc":"Andheri"},{"playerId":"3","playerLoc":"Churchgate"}]ในหลายรูปแบบ ฉันลองใช้ JsonUtility แล้ว แต่ฉันไม่สามารถแยกวัตถุและรับวัตถุ json แต่ละชิ้นได้ ถ้าคุณสามารถช่วยฉันด้วย
dil33pm

2
ดูรหัสที่ฉันโพสต์ไว้ด้านบน JsonUtility.FromJsonมันแสดงให้เห็นคุณสามวิธีที่จะทำเช่นนั้นด้วย ฉันลืมบอกให้คุณลบออก{ get; set; }จากplayerชั้นเรียน ถ้าคุณมี{ get; set; }มันจะไม่ทำงาน เปรียบเทียบplayerชั้นเรียนของคุณกับชั้นเรียนที่ฉันโพสต์ไว้ด้านบนแล้วคุณจะเข้าใจสิ่งที่ฉันพูด
Programmer

1
ไม่มีปัญหา. ฉันจะแก้ไขสิ่งนี้เมื่อ Unity เพิ่มการรองรับอาร์เรย์ (ซึ่งเร็ว ๆ นี้) ดังนั้นคุณจะไม่ต้องการคลาส Helper นั้นอีกต่อไป
Programmer

1
ฉันจะไม่ไปไกลถึงขนาดที่จะพูดว่า "ลืมไลบรารีของบุคคลที่สามทั้งหมด" JsonUtility มีข้อ จำกัด ไม่ส่งคืนออบเจ็กต์ JSON ที่คุณสามารถดำเนินการได้ ตัวอย่างเช่นฉันได้รับไฟล์ json และต้องการตรวจสอบว่ามีคีย์ "สำเร็จ" หรือไม่ ไม่สามารถทำได้ JsonUtility ต้องการให้ผู้บริโภคทราบเนื้อหาที่แน่นอนของไฟล์ json นอกจากนี้ไม่มีตัวแปลงพจนานุกรม ดังนั้นจึงเป็นสิ่งที่ดี แต่ยังคงต้องใช้บุคคลที่สาม
Everts

2
ใช้JsonHelper. ทุกอย่างปกติดี. หากคุณสร้าง Json ด้วยคุณสามารถอ่าน json ได้โดยไม่มีขั้นตอนเพิ่มเติม ครั้งเดียวที่คุณอาจต้องทำสิ่งพิเศษคือถ้าคุณได้รับอาร์เรย์ json จากเซิร์ฟเวอร์และสิ่งนั้นรวมอยู่ในโซลูชันอยู่ในคำตอบของฉัน อีกวิธีหนึ่งที่ไม่มีJsonHelperคือการใส่ชั้นเรียนในชั้นเรียนอื่นจากนั้นทำให้เป็นList. สิ่งนี้ได้ผลกับคนส่วนใหญ่ หากคุณกำลังมองหาวิธีการในการบันทึกและข้อมูลเกมโหลดแล้วดูนี้ คุณโหลดและบันทึกด้วยรหัสหนึ่งบรรทัด
Programmer

17

สมมติว่าคุณมี JSON แบบนี้

[
    {
        "type": "qrcode",
        "symbol": [
            {
                "seq": 0,
                "data": "HelloWorld9887725216",
                "error": null
            }
        ]
    }
]

ในการแยกวิเคราะห์ JSON ข้างต้นอย่างเป็นเอกภาพคุณสามารถสร้างโมเดล JSON เช่นนี้ได้

[System.Serializable]
public class QrCodeResult
{
    public QRCodeData[] result;
}

[System.Serializable]
public class Symbol
{
    public int seq;
    public string data;
    public string error;
}

[System.Serializable]
public class QRCodeData
{
    public string type;
    public Symbol[] symbol;
}

จากนั้นแยกวิเคราะห์ในลักษณะต่อไปนี้ ...

var myObject = JsonUtility.FromJson<QrCodeResult>("{\"result\":" + jsonString.ToString() + "}");

ตอนนี้คุณสามารถแก้ไข JSON / CODE ได้ตามความต้องการของคุณ https://docs.unity3d.com/Manual/JSONSerialization.html


สิ่งนี้ใช้งานได้ดีจริง ๆ ทำให้ทำงานร่วมกับคลาสเช่น Symbol ที่ไม่ใช่อาร์เรย์ได้เช่นกัน
Gennon

4
ฉันกำลังพยายามด้วยความสามัคคีในปี 2018 แต่ไม่ได้ผล: อาร์เรย์ไม่ได้รับการแยกวิเคราะห์
Jean-Michaël Celerier

ใช้ในความสามัคคีปี 2018 และ 2019 ใช้งานได้ดี เข้าถึงข้อมูลอาร์เรย์เช่น: Debug.Log(myObject.result[0].symbol[0].data);หรือfor(var i = 0; i <= myObject.result.Length - 1; i ++) { Debug.Log(myObject.result[i].type); }หรือforeach (var item in myObject.result) { Debug.Log(item.type); }
Towerss

@Narottam Goyal วิธีการของคุณไม่ได้ผลในบางกรณีนอกจากนี้ยังเป็นวิธีแก้ปัญหาที่ยากมากสำหรับผู้เริ่มต้นโปรดดูคำตอบของฉันในลิงค์ของ
Juned Khan Momin

@JunedKhanMomin คำตอบของคุณโดยพื้นฐานแล้วจะเหมือนกัน แต่ไม่ต้องตอบว่าคำถามนี้เกี่ยวกับอาร์เรย์ระดับรูทในข้อมูล JSON โดยเฉพาะ โดยทั่วไปคุณควรอ้างถึงคำตอบของโปรแกรมเมอร์ซึ่งอธิบายได้ละเอียดกว่า
derHugo

2

คุณต้องเพิ่ม[System.Serializable]ในPlayerItemชั้นเรียนดังนี้:

using System;
[System.Serializable]
public class PlayerItem   {
    public string playerId;
    public string playerLoc;
    public string playerNick;
}

1

หากต้องการอ่านไฟล์ JSON โปรดดูตัวอย่างง่ายๆนี้

ไฟล์ JSON ของคุณ (StreamingAssets / Player.json)

{
    "Name": "MyName",
    "Level": 4
}

สคริปต์ C #

public class Demo
{
    public void ReadJSON()
    {
        string path = Application.streamingAssetsPath + "/Player.json";
        string JSONString = File.ReadAllText(path);
        Player player = JsonUtility.FromJson<Player>(JSONString);
        Debug.Log(player.Name);
    }
}

[System.Serializable]
public class Player
{
    public string Name;
    public int Level;
}

1
แล้วอาร์เรย์ล่ะ? และคำตอบนี้เพิ่มอะไรที่ไม่ได้ระบุไว้ในคำตอบที่ยอมรับเมื่อ 3 ปีที่แล้ว?
derHugo

@derHugo รวมถึงการโทรFile.ReadAllTextที่ฉันคิดว่าเป็นประโยชน์และไม่มีคำตอบอื่น ๆ กล่าวถึง :)
Ruzihm

@Ruzihm เหตุผลที่ไม่มีคำตอบอื่น ๆ กล่าวถึงเป็นเพราะขอบเขตของคำถามนี้คือวิธีการ (de) serialize .. ไม่ใช่วิธีการทำ FileIO;)
derHugo

0

อย่าตัดแต่ง[]และคุณควรจะสบายดี []ระบุอาร์เรย์ JSON ซึ่งเป็นสิ่งที่คุณต้องการเพื่อให้สามารถวนซ้ำองค์ประกอบได้


0

เช่นเดียวกับที่ @Maximiliangerhardt กล่าวว่า MiniJson ไม่มีความสามารถในการ deserialize อย่างถูกต้อง ฉันใช้ JsonFx และทำงานได้อย่างมีเสน่ห์ ทำงานร่วมกับไฟล์[]

player[] p = JsonReader.Deserialize<player[]>(serviceData);
Debug.Log(p[0].playerId +" "+ p[0].playerLoc+"--"+ p[1].playerId + " " + p[1].playerLoc+"--"+ p[2].playerId + " " + p[2].playerLoc);

0

คุณสามารถใช้Newtonsoft.Jsonเพียงเพิ่มNewtonsoft.dllในโครงการของคุณและใช้สคริปต์ด้านล่าง

using System;
using Newtonsoft.Json;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{

    [Serializable]
    public class Person
    {
        public string id;
        public string name;
    }
    public Person[] person;

    private void Start()
    {
       var myjson = JsonConvert.SerializeObject(person);

        print(myjson);

    }
}

ป้อนคำอธิบายภาพที่นี่

อีกวิธีหนึ่งคือการใช้JsonHelper

using System;
using Newtonsoft.Json;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{

    [Serializable]
    public class Person
    {
        public string id;
        public string name;
    }
    public Person[] person;

    private void Start()
    {
        var myjson = JsonHelper.ToJson(person);

        print(myjson);

    }
}

ป้อนคำอธิบายภาพที่นี่


0

หากคุณใช้ Vector3 นี่คือสิ่งที่ฉันทำ

1- ฉันสร้างคลาสตั้งชื่อผู้เล่น

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[Serializable]
public class Player
{
    public Vector3[] Position;

}

2- แล้วฉันเรียกแบบนี้

if ( _ispressed == true)
        {
            Player playerInstance = new Player();
            playerInstance.Position = newPos;
            string jsonData = JsonUtility.ToJson(playerInstance);

            reference.Child("Position" + Random.Range(0, 1000000)).SetRawJsonValueAsync(jsonData);
            Debug.Log(jsonData);
            _ispressed = false;
        }

3- และนี่คือผลลัพธ์

"ตำแหน่ง": [{"x": - 2.8567452430725099, "y": - 2.4323320388793947, "z": 0.0}]}


0

ความสามัคคี <= 2019

Narottam Goyal มีความคิดที่ดีในการตัดอาร์เรย์ในวัตถุ json จากนั้นจึงแยกส่วนออกเป็นโครงสร้าง ต่อไปนี้ใช้ Generics เพื่อแก้ปัญหานี้สำหรับอาร์เรย์ทุกประเภทซึ่งต่างจากการสร้างคลาสใหม่ทุกครั้ง

[System.Serializable]
private struct JsonArrayWrapper<T> {
    public T wrap_result;
}

public static T ParseJsonArray<T>(string json) {
    var temp = JsonUtility.FromJson<JsonArrayWrapper<T>>("{\" wrap_result\":" + json + "}");
    return temp.wrap_result;
}

สามารถใช้ได้ด้วยวิธีต่อไปนี้:

string[] options = ParseJsonArray<string[]>(someArrayOfStringsJson);

Unity 2020

ใน Unity 2020 มีแพ็คเกจnewtonsoftอย่างเป็นทางการซึ่งเป็นไลบรารี json ที่ดีกว่ามาก


1
ลิงก์ที่คุณระบุนั้นไม่สามารถใช้งานได้ แต่ลิงก์นี้แสดงเป็นบทความที่เกี่ยวข้อง: docs.unity3d.com/Packages/com.unity.nuget.newtonsoft-json@2.0/… พร้อมหมายเหตุ: "นี่คือแพ็กเกจสำหรับ Unity Development ภายใน ไม่รองรับโปรเจ็กต์และแพ็กเกจนี้โปรดใช้ความเสี่ยงเอง "
R2RT
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.