Как реструктурировать вложенные данные JSON с C #? или единство - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь взять данные JSON (Структура # 1) и реструктурировать их в работоспособную структуру для использования в Unity (Структура # 2), поскольку JSONUtility.FromJSON в Unity не поддерживает вложенные объекты в структуре # 1.

Можно ли как-нибудь использовать Json.Net C #, чтобы изменить структуру # 1 и сделать ее похожей на # 2?

Структура # 1

Этот файл данных JSON содержит 30 000 объектов со случайными номерами узлов с координатами широты и долготы, это только небольшой фрагмент

{
  "71": {
    "longitude": -179.5,
    "latitude": -19.5
  },
  "72": {
    "longitude": -179.5,
    "latitude": -18.5
  },
  "157": {
    "longitude": -179.5,
    "latitude": 66.5
  },
  "158": {
    "longitude": -179.5,
    "latitude": 67.5
  }
}

Превратиться в это ...

Структура #2


[  
   {  
      "nodeId": 71,
      "longitude": -179.5,
      "latitude": -19.5      
   },
   {  
      "nodeId": 72,
      "longitude": -179.5,
      "latitude": -18.5      
   },
   {  
      "nodeId": 157,
      "longitude": -179.5,
      "latitude": 66.5      
   },
   {  
      "nodeId": 158,
      "longitude": -179.5,
      "latitude": 67.5      
   }
]

Ниже приведен код, который я хочу использовать, если это преобразование возможно

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SpatialMapper : MonoBehaviour
{
    TextAsset jsonObj;

    private void Start()
    {
        MapPoints();
    }

    public void MapPoints()
    {
        jsonObj = Resources.Load("LocationNodes") as TextAsset;

        string localJsonData = jsonObj.text;

        JSONObjectContainer jsonObjects = JsonUtility.FromJson<JSONObjectContainer>(localJsonData);

        foreach (var item in jsonObjects.rootNodes)
        {
            print(item.NodeId);
        }
    }

    [System.Serializable]
    public class JSONObjectContainer
    {
        public RootNode[] rootNodes;
    }

    [System.Serializable]
    public class RootNode
    {
        public string NodeId;
        public NodeData nodeData;
    }

    [System.Serializable]
    public class NodeData
    {
        public string latitude;
        public string longitude;
    }
}

1 Ответ

1 голос
/ 09 мая 2019

Используя JSON.NET, поскольку имена свойств (ваши значения nodeId) являются динамическими, вы можете прочитать их в словарь. Затем вы можете перебрать словарь и создать список правильного формата, а затем сериализовать его:

        const string sourceJson = "{  \"71\": {    \"longitude\": -179.5,    \"latitude\": -19.5  },  \"72\": {    \"longitude\": -179.5,    \"latitude\": -18.5  },  \"157\": {    \"longitude\": -179.5,    \"latitude\": 66.5  },  \"158\": {    \"longitude\": -179.5,    \"latitude\": 67.5  }}";

        private class OldEntry {
            public double longitude { get; set; }
            public double latitude { get; set; }
        }

        private class NewEntry {
            public int nodeId { get; set; }
            public double longitude { get; set; }
            public double latitude { get; set; }
        }

        static void Main(string[] args) {
            var oldData = JsonConvert.DeserializeObject<Dictionary<string, OldEntry>>(sourceJson);
            var newData = new List<NewEntry>(oldData.Count);
            foreach (var kvp in oldData) {
                newData.Add(new NewEntry() {
                    nodeId = int.Parse(kvp.Key),
                    longitude = kvp.Value.longitude,
                    latitude = kvp.Value.latitude
                });
            }
            Console.WriteLine(JsonConvert.SerializeObject(newData, Formatting.Indented));
        }
...