有没有一种方法可以将JSON转换为以List <object>作为参数的C#类?

时间:2019-05-17 20:03:55

标签: c# json unity3d

Unity中是否可以将JSON字符串解析为具有-假设-字符串列表的C#类?

我有一个从服务器获取大量数据的应用程序。该数据来自JSON,并且具有很多字段。有些字段包含另一个数组(我知道里面有一个数组,没有的数组)。

知道这一点后,我想将其放入一个类中,以便可以访问其参数,[我无法创建数组并尝试访问-例如-arr [0],因为arr [0]可能不是我想要的字段-鉴于数组位置可以更改,但是field-key(如果数组内部有数组,则为field-field-key)值不会]

{
  "success": "1",
  "menus": [
    {
      "id_menu": "506",
      "nome": "Blog",
      "tipo": "blog"
    },
    {
      "id_menu": "510",
      "nome": "Sobre",
      "tipo": ""
    },
    {
      "id_menu": "2407",
      "nome": "(Projeto Quatro Artes)",
      "tipo": ""
    },
    {
      "id_menu": "2603",
      "nome": "(Loja)",
      "tipo": ""
    },
    {
      "id_menu": "2687",
      "nome": "(Material NA)",
      "tipo": ""
    },
    {
      "id_menu": "2818",
      "nome": "(Forms)",
      "tipo": ""
    },
    {
      "id_menu": "2826",
      "nome": "(PHP+PIZZA)",
      "tipo": ""
    },
    {
      "id_menu": "7728",
      "nome": "(Image)",
      "tipo": ""
    },
    {
      "id_menu": "3239",
      "nome": "(jc)",
      "tipo": ""
    },
    {
      "id_menu": "6024",
      "nome": "(assinatura)",
      "tipo": ""
    }
  ]
}

上面的代码是我要解析的JSONS之一,下面的代码是我对其进行解析的类。现在我只需要知道如何去做。

[System.Serializable]
public class Menu
{
    public string id_menu { get; set; }
    public string nome { get; set; }
    public string tipo { get; set; }
}

[System.Serializable]
public class Return
{
    public string success { get; set; }
    public List<Menu> menus { get; set; }
}

我知道,如果没有任何列表,则JsonUtility.FromJson()可以完成此工作,但是对于列表,它只是行不通 另外,尝试从Unity资产中使用JSONObject也不起作用,因为我无法访问return.menus.tipo(例如),因为它没有关联索引。

3 个答案:

答案 0 :(得分:1)

是使用Json.NET还是另一个完全支持任意类型的反序列化器?

public class MyClass
{
    public string id_menu { get; set; }
    public string nome { get; set; }
    public string tipo { get; set; }
    public List<string> my_list {get; set; }
}

var result = JsonConvert.DeserializeObject<MyClass>(json);

答案 1 :(得分:0)

如果您尝试通过Unity解析Json,则可以使用JsonUtility.FromJson(jsonString),它将Json解析为可以处理的对象,但我从未尝试使用复杂的JSON。

或者您可以遍历json并搜索所需的键值,但这肯定会增加内存消耗。

答案 2 :(得分:0)

您可以通过以下方式进行操作:

var returnObj = JsonConvert.DeserializeObject<Return>(json);

为此,您需要以下软件包: Newtonsoft.Json

结果如下: enter image description here

我制作了一个小型控制台应用程序,向您展示了方法。在Unity中应该相同:

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Text;

namespace IoException
{
    [System.Serializable]
    public class Menu
    {
        public string id_menu { get; set; }
        public string nome { get; set; }
        public string tipo { get; set; }
    }

    [System.Serializable]
    public class Return
    {
        public string success { get; set; }
        public List<Menu> menus { get; set; }
    }

    public class JsonExercise
    {
        public static void Main(string[] args)
        {
            var currentLine = Console.ReadLine();
            var sb = new StringBuilder();

            while (currentLine != "END")
            {
                sb.AppendLine(currentLine);

                currentLine = Console.ReadLine();
            }

            var json = sb.ToString().Trim();

            var returnObj = JsonConvert.DeserializeObject<Return>(json);

            Console.WriteLine();
        }
    }
}

有关控制台应用程序的注释,以备不时之需:

  • 输入JSON时,在最后一行输入“ END”,以使控制台应用程序停止读取。
  • 对于输入的JSON,我使用了您提供的JSON。