JSONObject中每个JSONnode的Unity

时间:2016-04-30 17:09:30

标签: c# json node.js unity3d

我正在使用Unity和Socket.IO以及NodeJS服务器,当玩家加入我需要向他发送有关其他玩家的信息以将其添加到他的游戏中。服务器发送此json字符串:

{  
   "players":{  
      "/#3vd98L1t96vgMwRsAAAB":{  
         "name":"Player #2",
         "x":0,
         "y":0
      },
      "/#RaLyZw7Rnp94nDXkAAAF":{  
         "name":"Player #6",
         "x":0,
         "y":0
      }
   }
}

但我无法找到如何在统一中推翻这个问题? 我认为用它制作一个物体就可以了,所以这就是我想出的:

JSONObject players = new JSONObject(e.data.GetField("players").ToString());

但是我怎么能用它来制作一个foreach循环呢?

2 个答案:

答案 0 :(得分:1)

假设您的e.data是从您展示的JSON创建的JSONObject,您可以执行以下操作:

var players = e.data.GetField("players");

for(int i = 0; i < players.list.Count; i++)
{
    string playerKey = (string)players.keys[i];
    JSONObject playerData = (JSONObject)players.list[i];
    // Process the player key and data as you need.
}

有关相关文档,请参阅JSONObject: Decoding

为方便起见,您可能希望将此逻辑封装在extension method中以供以后重复使用:

public static class JSONObjectExtensions
{
    public static IEnumerable<KeyValuePair<string, JSONObject>> NameValuePairs(this JSONObject obj)
    {
        if (obj == null)
            throw new ArgumentNullException();
        if (obj.type != JSONObject.Type.OBJECT)
            throw new InvalidOperationException(string.Format("Incoming object type {0} is not JSONObject.Type.OBJECT.", obj.type));
        for (int i = 0; i < obj.list.Count; i++)
        {
            string key = (string)obj.keys[i];
            JSONObject j = (JSONObject)obj.list[i];
            yield return new KeyValuePair<string, JSONObject>(key, j);
        }
    }
}

然后你可以做

foreach (var pair in players.NameValuePairs())
{
    // Process the player key and data as you need.
}

答案 1 :(得分:0)

您没有提到您正在使用的库。 Unity在版本 5.3 中添加了原生Jason序列化程序。

将类转换为Json字符串:

string jsonString = JsonUtility.ToJson(className);

将Json字符串转换为class:

ClassName serializedPlayer = new ClassName();
serializedPlayer = JsonUtility.FromJson<ClassName>(jsonString);

我提供的答案here介绍了如何使用数组 json。这是一个很长的过程,需要重新发布,但它是你正在寻找的。你应该阅读第二个解决方案,上面写着“ 2.多个数据(ARRAY JSON)。”