简体   繁体   English

从JSON文件读取并映射对象

[英]Read from JSON file and map the objects

So I've got this huge JSON file available from which I need to extract data. 因此,我有这个巨大的JSON文件,我需要从中提取数据。 The JSON format goes something like this: JSON格式如下所示:

{
  "enabled":true,
  "contentMetadataPartial":
  {
     "customTags":
     {
        "tag1":"value1"
     }
  },
  "simulatedChanges":
  [
     3000,
     2500,
     400
  ],
  "simulatedUpdateMetadata":
  [
     {
        "customTags":
        {
           "tag1":"value1",
        },
        "assetName":"asset1234",
     },
     {
        "duration":1111,
        "encodedRate":3333,
     }
  ]
}

To read it I was trying to create a class to the map the keys and objects. 为了阅读它,我试图创建一个类来映射键和对象。 Something like this, similar to this question: 类似这样的东西,类似于这个问题:

public class ConfigData
{
    private Boolean enabled;
    private class ContentMetadataPartial
    {
        private class CustomTags
        {
            String tag1;
        }
    }
    int[] simulatedChanges = new int[3];

    //problem here
}

But I'm getting stuck at the array, which contains more objects not just simple basic data types. 但是我陷入了数组,该数组包含更多对象,而不仅仅是简单的基本数据类型。

The JSON file is huge and has similar type of items all over it. JSON文件很大,并且整个项目都有相似的类型。 I'm fairly new with this and may be doing some mistake. 我对此很陌生,可能会犯一些错误。 Any help towards right direction is appreciated. 任何朝着正确方向的帮助将不胜感激。 Thanks! 谢谢!

You need a classes structure, not all in one: 您需要一个类结构,而不是一个一个:

ConfigData: ConfigData:

package com.example.gson;

import java.util.List;

public class ConfigData {

    private Boolean enabled;
    private ContentMetadataPartial contentMetadataPartial;
    private List<Integer> simulatedChanges = null;
    private List<SimulatedUpdateMetadatum> simulatedUpdateMetadata = null;

    public Boolean getEnabled() {
        return enabled;
    }

    public void setEnabled(Boolean enabled) {
        this.enabled = enabled;
    }

    public ContentMetadataPartial getContentMetadataPartial() {
        return contentMetadataPartial;
    }

    public void setContentMetadataPartial(ContentMetadataPartial contentMetadataPartial) {
        this.contentMetadataPartial = contentMetadataPartial;
    }

    public List<Integer> getSimulatedChanges() {
        return simulatedChanges;
    }

    public void setSimulatedChanges(List<Integer> simulatedChanges) {
        this.simulatedChanges = simulatedChanges;
    }

    public List<SimulatedUpdateMetadatum> getSimulatedUpdateMetadata() {
        return simulatedUpdateMetadata;
    }

    public void setSimulatedUpdateMetadata(List<SimulatedUpdateMetadatum> simulatedUpdateMetadata) {
        this.simulatedUpdateMetadata = simulatedUpdateMetadata;
    }

    @Override
    public String toString() {
        return "ConfigData [enabled=" + enabled + ", contentMetadataPartial=" + contentMetadataPartial
                + ", simulatedChanges=" + simulatedChanges + ", simulatedUpdateMetadata=" + simulatedUpdateMetadata
                + "]";
    }

}

ContentMetadataPartial: ContentMetadataPartial:

package com.example.gson;

public class ContentMetadataPartial {

    private CustomTags customTags;

    public CustomTags getCustomTags() {
        return customTags;
    }

    public void setCustomTags(CustomTags customTags) {
        this.customTags = customTags;
    }

}

CustomTags: CustomTags:

package com.example.gson;

public class CustomTags {

    private String tag1;

    public String getTag1() {
        return tag1;
    }

    public void setTag1(String tag1) {
        this.tag1 = tag1;
    }

}

SimulatedUpdateMetadatum: SimulatedUpdateMetadatum:

package com.example.gson;

public class SimulatedUpdateMetadatum {

    private CustomTags customTags;
    private String assetName;
    private Integer duration;
    private Integer encodedRate;

    public CustomTags getCustomTags() {
        return customTags;
    }

    public void setCustomTags(CustomTags customTags) {
        this.customTags = customTags;
    }

    public String getAssetName() {
        return assetName;
    }

    public void setAssetName(String assetName) {
        this.assetName = assetName;
    }

    public Integer getDuration() {
        return duration;
    }

    public void setDuration(Integer duration) {
        this.duration = duration;
    }

    public Integer getEncodedRate() {
        return encodedRate;
    }

    public void setEncodedRate(Integer encodedRate) {
        this.encodedRate = encodedRate;
    }

}

GsonMain: GsonMain:

package com.example.gson;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

import com.example.gson.ConfigData;
import com.google.gson.Gson;

public class GsonMain {

    private static final String jsonFile = "files/input.json";

    public static void main(String[] args) {
        String content = readFile(jsonFile);

        ConfigData conf = new Gson().fromJson(content, ConfigData.class);
        System.out.println(conf);
    }

    private static String readFile(String filename) {
        BufferedReader br = null;
        FileReader fr = null;
        StringBuilder content = new StringBuilder();

        try {
            fr = new FileReader(filename);
            br = new BufferedReader(fr);

            String sCurrentLine;
            while ((sCurrentLine = br.readLine()) != null) {
                content.append(sCurrentLine);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (br != null)
                    br.close();
                if (fr != null)
                    fr.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        return content.toString();
    }
}

And your Json well formed: 而且您的Json格式良好:

{
  "enabled":true,
  "contentMetadataPartial":
  {
     "customTags":
     {
        "tag1":"value1"
     }
  },
  "simulatedChanges":
  [
     3000,
     2500,
     400
  ],
  "simulatedUpdateMetadata":
  [
     {
        "customTags":
        {
           "tag1":"value1"
        },
        "assetName":"asset1234"
     },
     {
        "duration":1111,
        "encodedRate":3333
     }
  ]
}

I have used this web to generate the classes. 我已使用此Web生成类。

  package com.webom.practice;

  import java.util.ArrayList;
  import java.util.HashMap;
  import java.util.Iterator;
  import java.util.List;
  import java.util.Map;
  import org.json.JSONArray;
   import org.json.JSONException; 
   import org.json.JSONObject;

public class Sample {

    public static Map<String, Object> jsonToMap(JSONObject json) throws JSONException {
        Map<String, Object> retMap = new HashMap<String, Object>();

        if(json != JSONObject.NULL) {
            retMap = toMap(json);
        }
        return retMap;
    }

    public static Map<String, Object> toMap(JSONObject object) throws JSONException {
        Map<String, Object> map = new HashMap<String, Object>();

        Iterator<String> keysItr = object.keys();
        while(keysItr.hasNext()) {
            String key = keysItr.next();
            Object value = object.get(key);

            if(value instanceof JSONArray) {
                value = toList((JSONArray) value);
            }

            else if(value instanceof JSONObject) {
                value = toMap((JSONObject) value);
            }
            map.put(key, value);
        }
        return map;
    }
    public static List<Object> toList(JSONArray array) throws JSONException {
        List<Object> list = new ArrayList<Object>();
        for(int i = 0; i < array.length(); i++) {
            Object value = array.get(i);
            if(value instanceof JSONArray) {
                value = toList((JSONArray) value);
            }

            else if(value instanceof JSONObject) {
                value = toMap((JSONObject) value);
            }
            list.add(value);
        }
        return list;
    }
public static void main(String[]args) {
    String Jsondata="{\r\n" + 
            "  \"enabled\":true,\r\n" + 
            "  \"contentMetadataPartial\":\r\n" + 
            "  {\r\n" + 
            "     \"customTags\":\r\n" + 
            "     {\r\n" + 
            "        \"tag1\":\"value1\"\r\n" + 
            "     }\r\n" + 
            "  },\r\n" + 
            "  \"simulatedChanges\":\r\n" + 
            "  [\r\n" + 
            "     3000,\r\n" + 
            "     2500,\r\n" + 
            "     400\r\n" + 
            "  ],\r\n" + 
            "  \"simulatedUpdateMetadata\":\r\n" + 
            "  [\r\n" + 
            "     {\r\n" + 
            "        \"customTags\":\r\n" + 
            "        {\r\n" + 
            "           \"tag1\":\"value1\",\r\n" + 
            "        },\r\n" + 
            "        \"assetName\":\"asset1234\",\r\n" + 
            "     },\r\n" + 
            "     {\r\n" + 
            "        \"duration\":1111,\r\n" + 
            "        \"encodedRate\":3333,\r\n" + 
            "     }\r\n" + 
            "  ]\r\n" + 
            "}\r\n" ;
     JSONObject json = new JSONObject(Jsondata);
     System.out.println(json);
Map<String,Object> dataConversion=Sample.jsonToMap(json);
System.out.println(dataConversion);
}
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM