Десериализация проблемы JSON - PullRequest
0 голосов
/ 01 октября 2019

Мне нужно десериализовать только часть строки JSON, возвращенной с сервера. Часть 'myData' в строке JSON ниже.

Моя строка 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 Десериализация всей строки

Ответы [ 3 ]

1 голос
/ 01 октября 2019

В качестве альтернативы использованию JsonUtility существует старый добрый SimpleJSON, который позволяет вам получить доступ только к определенному полю вашего json, например,

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

ВВ общем, самый простой способ получить необходимую структуру класса c # для вашего json - это всегда использовать 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;

Как уже было сказано, вложенный массив вваш массив .. не уверен, если это предназначено.

0 голосов
/ 02 октября 2019

хорошо, используйте один из мощных 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
      }

  }
0 голосов
/ 01 октября 2019

JsonUtility не работает с файлами JSON, это только для сохранения и загрузки основных открытых переменных некоторого класса. У Asset Store есть много фреймворков для разбора json. ps ваш json странный, [] его массив и у вас есть feedMe:[[{myData, moreData}]]. Один массив, когда только один объект в массиве ... парсинг сбивает с толку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...