2017-04-02 109 views
-1

我在我的API响应的一个领域嵌套的JSON:解析一个字段从嵌套的Json字符串值

"ratingBest": 10, 
"reviewCount": 1, 
"coordinate": { 
    "latitude": "-7.2768", 
    "longitude": "112.7927" 
}, 
... 

我节省使用ORMLite上述数据至Android本地数据库,但我只想要一个字段coordinateString。原因Gson自动转换为特定类型。

我已经尝试使用类字段类型作为字符串。但仍然不起作用

任何解决方法?

谢谢

+0

你好吗?为了达到这个目的?你在哪里与Gson保存模型? –

+0

尚未实施。但对于正常的响应,我在Android中使用ORMLite helper,并且只需使用来自API的Json响应作为参数调用'create()'方法即可。我希望一个字段'coordinate'保存为'String',因为Gson会自动将每个响应转换为特定类型。 – fanjavaid

回答

0

试试这个。

var a = { 
    "ratingBest": 10, 
    "reviewCount": 1, 
    "coordinate": { 
    "latitude": "-7.2768", 
    "longitude": "112.7927" 
} 
} 

var b = { 
    "ratingBest": 10, 
    "reviewCount": 1, 
    "coordinate": JSON.stringify(a.coordinate) 
} 

现在商店B

+0

哈哈我问'JSON在'Android',而不是Javascript。在Android中,我使用ORMLite自动使用'create()'方法来存储API的响应。我还没有发现除了一个字段被保存为'String'。我希望你明白我的意思。谢谢 – fanjavaid

0

您可以通过以下方式做到这一点:

myObj = { 
    "ratingBest": 10, 
    "reviewCount": 1, 
    "coordinate": { 
    "latitude": "-7.2768", 
    "longitude": "112.7927" 
     } 
    } 
var latitudex = myObj.coordinate.latitude; 
var longitudex = myObj.coordinate.longitude; 

希望它会帮助你。

+0

谢谢,但我在Gson实现中询问。 Java – fanjavaid

+0

@fanjavaid你可以关注这个[generate-json-from-java-objects](http://tutorials.jenkov.com/java-json/gson.html#generating-json-from-java-objects) –

2

我假设你不打算以任何方式处理纬度/经度对,因为你再没提到它,你的“行”应该是这样的:

final class Location { 

    final int ratingBest = Integer.valueOf(0); 

    final int reviewCount = Integer.valueOf(0); 

    @JsonAdapter(PackedCoordinateTypeAdapter.class) 
    final String coordinate = null; 

} 

查看将特定类型适配器绑定到该字段的@JsonAdapter注释。类型适配器可能看起来像这样:

final class PackedCoordinateTypeAdapter 
     extends TypeAdapter<String> { 

    private static final String DELIMITER = " "; 
    private static final String LATITUDE = "latitude"; 
    private static final String LONGITUDE = "longitude"; 

    private static final Pattern delimiterPattern = compile(DELIMITER); 

    // Keep private stuff private as much possible, Gson can access it 
    private PackedCoordinateTypeAdapter() { 
    } 

    @Override 
    @SuppressWarnings("resource") 
    public void write(final JsonWriter out, final String packedLatitudeLongitude) 
      throws IOException { 
     final String[] split = decode(packedLatitudeLongitude); 
     out.beginObject(); 
     out.name(LATITUDE); 
     out.value(split[0]); 
     out.name(LONGITUDE); 
     out.value(split[1]); 
     out.endObject(); 
    } 

    @Override 
    public String read(final JsonReader in) 
      throws IOException { 
     String latitude = null; 
     String longitude = null; 
     in.beginObject(); 
     while (in.hasNext()) { 
      final String name = in.nextName(); 
      switch (name) { 
      case LATITUDE: 
       latitude = in.nextString(); 
       break; 
      case LONGITUDE: 
       longitude = in.nextString(); 
       break; 
      default: 
       throw new MalformedJsonException("Unexpected: " + name); 
      } 
     } 
     in.endObject(); 
     return encode(latitude, longitude); 
    } 

    private static String encode(final String latitude, final String longitude) 
      throws MalformedJsonException { 
     if (latitude == null) { 
      throw new MalformedJsonException("latitude not set"); 
     } 
     if (longitude == null) { 
      throw new MalformedJsonException("longitude not set"); 
     } 
     return latitude + DELIMITER + longitude; 
    } 

    private static String[] decode(final String packedLatitudeLongitude) 
      throws IllegalArgumentException { 
     final String[] split = delimiterPattern.split(packedLatitudeLongitude); 
     if (split.length != 2) { 
      throw new IllegalArgumentException("Cannot parse: " + packedLatitudeLongitude); 
     } 
     return split; 
    } 

} 

演示:

final Location response = gson.fromJson("{\"ratingBest\":10,\"reviewCount\":1,\"coordinate\":{\"latitude\":\"-7.2768\",\"longitude\":\"112.7927\"}}", Location.class); 
System.out.println(response.coordinate); 
System.out.println(gson.toJson(response)); 

输出:

-7.2768 112.7927
{ “ratingBest”:10 “reviewCount”:1, “coordinate”:{“latitude”:“ - 7.2768”,“longitude”:“112.7927”}}