如何将具有动态字段的Json字符串转换为对象?

9

我有以下的Json字符串片段:

 {
  "networks": {
    "tech11": {
        "id": "1",
        "name": "IDEN"
    },
    "tech12": {
        "id": "2",
        "name": "EVDO_B"
    }
 }
}

我使用了一些方法将这个字符串转换为对象:

    private static Gson mGson = new Gson();

    ...

public static WebObjectResponse convertJsonToObject(String jsonString) {

    WebObjectResponse webObjectResponse = null;


    if(jsonString != null && jsonString.length() > 1){
        webObjectResponse = mGson.fromJson(jsonString, WebObjectResponse.class);
    }

    return webObjectResponse;

}

在上述提到的字符串中,WebObjectResponse 是应该表示该类的类。

如果我获得静态字段,那么这并不复杂。 但在我的情况下,这些值具有不同的名称:tech11tech12 等等。

我可以使用 @SerializedName,但它只适用于特定情况,例如将“class”转换为“class_”。 正如您所看到的,networks 对象被定义为 tech 对象的列表,但后缀不同。

public class WebObjectResponse{
 private DataInfoList networks = null;
} 

这是静态实现,我定义了2个值tech11tech12,但下一个响应可能是techXX

public class DataInfoList {
 private DataInfo tech11 = null;
 private DataInfo tech12 = null;
}


public class DataInfo {
 private String id = null;
 private String name = null;
}

如何将当前的 Json 字符串转换为对象,其中元素列表也是对象,并且具有不同的名称?

谢谢。


2
请展示 WebObjectResponse 类的相关部分,以了解其结构。 - Sotirios Delimanolis
1
现在,它应该可以完美地映射。如果您有可变数量的 DataInfo 对象,则考虑使用一个 map,其中 techXX 作为 String 键。 - Sotirios Delimanolis
3个回答

7

使用地图!

我会采取以下措施:

public class WebObjectResponse {
     private Map<String, DataInfo> networks;
} 

public class DataInfo {
     private String id = null;
     private String name = null;
}

// later
Gson gson = new Gson();
String json = "{\"networks\": {\"tech11\": { \"id\": \"1\",\"name\": \"IDEN\" },  \"tech12\": { \"id\": \"2\", \"name\": \"EVDO_B\" }    }}";

WebObjectResponse response = gson.fromJson(json, WebObjectResponse .class);

对于json中的每个对象,都会在类WebObjectResponse的Map字段中添加一个新条目。然后您可以通过techXX引用它们或通过keyset进行迭代。
假设结构如下:
{
  "networks": {
    "tech11": {
        "id": "1",
        "name": "IDEN"
    },
    "tech12": {
        "id": "2",
        "name": "EVDO_B"
    },
    "tech13": {
        "id": "3",
        "name": "WOHOO"
    }, ...
  }
}

2
我们需要您的课程结构以获取更多详细信息。
据我所知,您需要在某个地方定义一些映射(我使用了xml),然后尝试将json与其中一个映射匹配以创建对象。
Google gson很好用。我用的是Jackson
此外,转换对象应该很容易。但是,由于您可能有变量字段,例如tech11tech12,因此您可能希望将“network”值存储为字符串,然后在需要时提取字段。
希望我能帮到您。
编辑:Sotirious做得很好。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接