Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
1
Question by Bobby21 · Apr 17, 2019 at 12:02 PM · c#jsonwebrequestdatastructure

Issue assigning JSON Data to Class Structure

Hello there!

Here's a bit of background information:


I'm making a GET request to retrieve JSON data, and I'm trying to store that data into a structure of classes. Printing the retrieved data to the console works, but assigning it to the classes does not (it remains empty in the inspector after the request.)


I’ve split the code into two sections.

 1. Makes the web request and attempts to store the data into a class structure.

 2. The current class structure


Here is a link to the JSON Data I’m using.


 public class WebRequestTest : MonoBehaviour
 {
     public string uri = "https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol=MSFT&interval=5min&apikey=demo";
 
     public RootObject rootObj;
 
     void Start()
     {
         StartCoroutine(GetRequest(uri));
     }
 
     IEnumerator GetRequest(string uri)
     {
         UnityWebRequest req = UnityWebRequest.Get(uri);
         yield return req.SendWebRequest();
 
         Debug.Log(req.downloadHandler.text);
 
         rootObj = JsonUtility.FromJson<RootObject>(req.downloadHandler.text);
     }
 }

Below is the structure for my classes so far. I'm imagining that the issue might be with TimeSeries.dataPeriods.

(TLDR: I wasn't sure whether to use an array, a list, or something else; but I settled on a list.)

 [Serializable]
 public class RootObject
 {
     public MetaData metaData;
     public TimeSeries timeSeries;
 }
 
 [Serializable]
 public class MetaData
 {
     public string Information;
     public string Symbol;
     public string LastRefreshed;
     public string OutputSize;
     public string TimeZone;
 }
 
 [Serializable]
 public class TimeSeries
 {
     public List<DataPeriod> dataPeriods;
 }
 
 [Serializable]
 public class DataPeriod
 {
     public Data data;
 }
 
 [Serializable]
 public class Data
 {
     public string Open;
     public string High;
     public string Low;
     public string Close;
     public string Volume;
 }

You may have noticed in the Data class that I stored all the numeric data as strings. I thought I'd need to store them this way at first because they are coming from JSON and then convert them later when needed. (Perhaps there is a more elegant way to handle this?)


Final questions:

  1. Am I handling comma separated objects the right way by using a list or should I be doing something else?

  2. Does anything stand out as to whats preventing the data from being assigned into the RootObject class?

 3. If you have any insights about what would be a good way to handle converting the numbers to ints/floats when the class is created, I would love to hear it! 

Thank you so much for reading this! I'm going to keep working on this and will post an update when I can.

Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

1 Reply

· Add your reply
  • Sort: 
avatar image
2
Best Answer

Answer by Bunny83 · Apr 16, 2019 at 09:29 PM

The Json data that your server provides can't be mapped to a class since your keys contain illegal characters for C# classes. Specifically spaces, brackets, dashes and colons. Furthermore the data doesn't contain a single array (json array). The whole data is composed of objects. So you can not use Lists or arrays at all. Unity's JsonUtility is very limited. For arbitrary data you may want to use my SimpleJSON library.


It does not parse the data into actual C# classes but into generic nodes to represent objects as Dictionarys (JSONObject) and arrays as lists (JSONArray). Though the interface is designed to make the usage extremely easy. You almost never have to deal with the individual node types. There are many casting properties and implicit type conversions built into the JSONNode base class.


To use SimpleJSON, just place the file in your project and do:

 var root = JSON.Parse(req.downloadHandler.text);
 string info = root["Meta Data"]["1. Information"].Value;
 var timeSeries = root["Time Series (5min)"];
 foreach(var kv in timeSeries)
 {
     Debug.Log("Time: " + kv.Key);
     Debug.Log("open: " + kv.Value["1. open"].Value);
 }


Note that if you control the format of your json data i strongly recommend you change it. Using things like 1, 2, 3 combined with a text as key is extrem bad style.

Comment
Add comment · Show 3 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Bobby21 · Apr 17, 2019 at 03:46 AM 1
Share

Thank you for the amazing response! Your explanation really helped to clarify this topic and that is quite an amazing library you’ve made.

It took me a little while to get one of the string keys to log out correctly, mainly because of a silly 1 character typo haha.

Definitely makes me think you’d use constants for the keys ins$$anonymous$$d of typing them out. I didn’t have control over the data format but I can totally see how the numbers with text is a bad na$$anonymous$$g convention.

Again many thanks for the clarification on this though Bunny and for sharing your library!

avatar image Bunny83 Bobby21 · Apr 17, 2019 at 01:01 PM 1
Share

Yes, I have already realised that this Web service you're using there is really an official one. They should win a price for one of the worst designed APIs. Json is mainly meant for computer processing. It seems they tried to make it more "human readable" and violates the basic principles of database normalization.


It's actually worse than I expected. The two examples (this and this) have actual different information fields. They always put those numbers before their keys, no matter which key it is. So while the key is "6. Time Zone" in the first case, it's "5. Time Zone" in the second ... (no words)


You may be better off using their CSV format which seems to be a lot cleaner. Even you have to parse the CSV format yourself it seems much more robust than their strange json format.

avatar image Bobby21 Bunny83 · Apr 17, 2019 at 04:32 PM 0
Share

Haha yea, it's pretty strange decision they made going with that. I'll be sure to pass along your thoughts on it if I speak with them.

Even though I'm not going to go much further with this project (it was more of an experiment in data visualization,) I'm going to check out parsing their CSV format because I'm sure its important to understand how to do it in the long-term.

If you have any handy reference material on that I'm sure anyone reading this and I will greatly appreciate it!

Thanks again.

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

606 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Multiple Cars not working 1 Answer

Distribute terrain in zones 3 Answers

Parsing multiple json files that are referencing each other 0 Answers

Write data to Json database using SimpleJson.cs 1 Answer

Is there a reason not to use system.json.dll? 2 Answers


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges