首页 > 解决方案 > 反序列化 JSON 问题

问题描述

我只需要反序列化从服务器返回的 JSON 字符串的一部分。下面 JSON 字符串中的“myData”部分。

我的 JSON 字符串的结构如下。

{
    "data": {
        "CODE": {
            "someData": {
                "h": "foo",
                "id": "City",
                "lat": "11.11111"
            },
            "feedMe": [
                [
                    {
                        "myData": {
                            "item1": "a",
                            "item2": "b",
                            "item3": "c"
                        },
                        "moreData": {}
                    }
                ]
            ]
        }
    }
}

在 Unity 中有 JSONutility.FromJson 方法 https://docs.unity3d.com/ScriptReference/JsonUtility.FromJson.html

但不确定我会怎么做

1 仅将“myData”部分传递给此方法。

或者

2 反序列化整个字符串

标签: c#jsonunity3d

解决方案


使用JsonUtilitythere 的另一种方法是旧的SimpleJSON,它允许您仅访问 json 的某个字段,例如

var N = JSON.Parse(the_JSON_string);
var myData = N["data"]["CODE"]["feedMe"][0][0];
var item2 = myData["item2"].Value;

通常,为您的 json 获取所需的 c# 类结构的最简单方法是始终使用json2csharp并创建所有类[Serializable]并删除{get; set;}以使用字段而不是属性。像这样的东西

[Serializable]
public class SomeData
{
    public string h;
    public string id;
    public string lat;
}

[Serializable]
public class CODE
{
    public SomeData someData;
    public List<List<MyData>> feedMe;
}

[Serializable]
public class MyData
{
    public string item1;
    public string item2;
    public string item3;
}

[Serializable]
public class Data
{
    public CODE CODE;
}

[Serializable]
public class RootObject
{
    public Data data;
}

如果你喜欢,List<T>你也可以使用。T[]类名实际上并不重要,但结构和字段名必须匹配。

然后使用

var root = JsonUtility.FromJson<RootObject>(THE_JSON_STRING);
var myData = root.data.CODE.feedMe[0][0];
var item2 = myData.item2;

正如已经评论过的那样,您的数组中有一个嵌套数组..不确定这是否是有意的。


推荐阅读