Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何用GSON解析变量类型的json?_Java_Json_Gson - Fatal编程技术网

Java 如何用GSON解析变量类型的json?

Java 如何用GSON解析变量类型的json?,java,json,gson,Java,Json,Gson,我喜欢那样的东西 { "data": "some data", "social": { "twitter": "id" } } 这很容易用下一个类解析 public class SocialLinks { @Expose private String data; @Expose private Social social; } public class Social { @Expose private String twitter; } 不幸的是,由于一些问题,如果s

我喜欢那样的东西

{
  "data": "some data",
  "social": {
    "twitter": "id"
  }
}
这很容易用下一个类解析

public class SocialLinks {

@Expose
private String data;
@Expose
private Social social;
}
public class Social {

@Expose
private String twitter;
}
不幸的是,由于一些问题,如果social是空的,它将作为数组返回

{
  "data": "some data",
  "social": [

  ]
}

如何使用gson解析它?(我不是服务器端的开发人员,不能影响Response消息)

您可以使用这些类来实现

SocialLinks.java

public class SocialLinks {
    private String data;
    private Social social;
    // Getters && Setters
}
Social.java:

public class Social {

    private String twitter;
    // Getters & Setters
}
这是你的主要方法

public class GsonApp {

    private static final String TEST_JSON = "{\n" +
            "  \"data\": \"some data\",\n" +
            "  \"social\": {\n" +
            "    \"twitter\": \"id\"\n" +
            "  }\n" +
            "}";


    public static void main(String[] args) throws Exception {
        final Gson gson = new GsonBuilder().create();
        // Read Example
        final SocialLinks socialLinks = gson.fromJson(TEST_JSON, SocialLinks.class);
        System.out.println(gson.toJson(socialLinks));

        // Write with null Social 
        final SocialLinks socialLinks1 = new SocialLinks();
        socialLinks1.setData("MyData");
        System.out.println(gson.toJson(socialLinks1));

        // Write with empty Social (social.twitter is null)    
        final SocialLinks socialLinks2 = new SocialLinks();
        socialLinks2.setData("MyData");
        socialLinks2.setSocial(new Social());
        System.out.println(gson.toJson(socialLinks2));

        // Write with full Social
        final SocialLinks socialLinks3 = new SocialLinks();
        socialLinks3.setData("MyData");
        socialLinks3.setSocial(new Social());
        socialLinks3.getSocial().setTwitter("ID");
        System.out.println(gson.toJson(socialLinks3));
    }
}
这将输出

{"data":"some data","social":{"twitter":"id"}}
{"data":"MyData"}
{"data":"MyData","social":{}}
{"data":"MyData","social":{"twitter":"ID"}}
更新 如果根据应用程序状态更改数据类型,则可能需要创建映射对象而不是DTO。这里有一个例子

private static final String TEST_JSON_2 = "{\n" +
        "  \"data\": \"some data\",\n" +
        "  \"social\": [\n" +
        "  ]\n" +
        "}";

...

    Type type = new TypeToken<Map<String, Object>>(){}.getType();
    final Map<String, Object> socialLinks4 = gson.fromJson(TEST_JSON_2, type);
    System.out.println(socialLinks4);

    final Map<String, Object> socialLinks5 = gson.fromJson(TEST_JSON, type);
    System.out.println(socialLinks5);

你能用gson粘贴解析代码吗?@Nitesh我使用的是基本方式:SocialLinks value=gson.fromJSON(jsonString,SocialLinks.class);我知道这很有效。我的问题是-有时sosial会因为服务器的状态配置而将其类型从JSON对象更改为JsonArray。@是哪一方生成JSON数组?你(服务器)?由于我演示了几乎所有的替代方案,我认为这不会为您生成Json数组。您的意思是,有时客户端发送数组而不是对象?服务器端为我的客户端get请求生成json响应。如果没有用于social的项-social是一个数组,否则-social是一个对象。我
{data=some data, social=[]}
{data=some data, social={twitter=id}}