【问题标题】:Deserializing JSON issue反序列化 JSON 问题
【发布时间】:2019-10-01 16:50:12
【问题描述】:

我只需要反序列化从服务器返回的 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 反序列化整个字符串

【问题讨论】:

  • 为什么数组中有数组?
  • 统一参考没有显示做这种事情的方法,您需要反序列化整个对象。
  • 为什么是数组中的数组?我问过同样的问题:)
  • 更新了基于 cmets 的问题。为了反序列化整个字符串,我调用JSONutility.FromJson时是否需要先创建一个结构相同的类用作对象类型?
  • 将您的 JSON 插入 this site,并将生成的类与您正在使用的代码进行比较。

标签: c# json unity3d


【解决方案1】:

使用 JsonUtility 的替代方法有一个很好的旧 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;
}

如果您愿意,也可以使用 T[] 代替 List&lt;T&gt;。并且类名实际上并不重要,但结构和字段名必须匹配。

然后使用

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

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

【讨论】:

    【解决方案2】:

    好吧,使用强大的 json nuget -newtonsoft.json 之一,然后在您的代码中您可以迭代如下值

    var files = JObject.Parse(YourJSON);
    var recList = files.SelectTokens("$..data").ToList();
    foreach (JObject obj in recList.Children())
     {
       foreach (JProperty prop in obj.Children())
          {
            var key = prop.Name.ToString();
            var value = prop.Value.ToString();
             //Do your stuffs here
          }
    
      }
    

    【讨论】:

      【解决方案3】:

      JsonUtility 不适用于 json 文件,这仅用于保存和加载某些类的基本公共变量。 Asset Store 有很多解析 json 的框架。 p.s.你的json很奇怪,[]它的数组,你有feedMe:[[{myData, moreData}]]。一个数组,当数组中只有一个对象时...解析混乱。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-23
        • 1970-01-01
        • 2021-05-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多